20230318 之前一直没有再继续更新是因为觉得繁琐,和我想要的一个编译器就行,不要那些混乱的库距离太大就暂停了一下,最近看dlang的日志看到可以支持位操作了,虽然还有很多bug.但它能用了 我这就提交上来一版可以编译通过可以烧录到stm32f401CC,正常执行的版本.我认为可以到试用阶段了. 原有体系被作废了,这次提交上来的也不确定后面会不会改,不过修改的目标是弄出一个开发用的库,完全不去交叉C的基础库,定位是源码库, 具体编译器参数查阅 dub.json ldc2.conf配置文件
编译说明 dub build 直接构建就好了 build --compiler=ldc2 --build=debug build --compiler=ldc2 --build=release
D语言原生的arm的hal操作库,直接使用LDC进行编译,无需交叉环境这种混乱东西. 通过SVD直接生成mc的底层操作,大部分功能基于D的模板进行实现,尽量实现D语言原生的实现.
本人搞单片机有点年头了,一直都是干应用的.常用开发软件用Keil,iar,一类的盗版软件,在经历2020年的时候突然发现不能在这样下去了, 各种技术上的卡脖子事情让我觉得应该 "搞点事情", 国产的MCU很多,真的不少,可为何开发软件及开发库就那么几种盗版的? 离开这些软件我们还能做自己的事情么? 所以我定下目标是搞一个D语言下的单片机开发(嵌入式的直接用就好了;~))
我认为D语言做开发有一些先天上的设计优势,比如说非常强力的编译前解释器(感觉类似很强的宏脚本解释器),把所有没必要的运算压在编译前.
资源文件无需转换直接嵌入 import(string file)
,
强大的 LDC 可以支持多种MCU及结构 (aarch64,arm,avr,mips,thumb,esp32.....),很适合搞事情,其内置的LDD还可以支持直接的bin输出(当前版本 LLVM 11还是存在TLS的BUG)
欢迎搞事情的人一起出手.
追加说明 用D搞这个有上面提到的原因,再就是现在的LL库和hal库都是人家ST的,国内芯片企业的库还都是纯寄存器控制,缺少 面向对象. 虽然D的betterC模式下不支持完整的面向对象操作,但它能用,可以给出基础的调用关系,更好的是 VScode上的D插件可以正确识别代码提示.
1, 能编译前做的,全部弄到编译前 2, 库中尽量避免嵌入汇编,避免特定汇编指令,能交给编译器的全部交给编译器 3, 类似bitband这种应用交给程序员去处理,库中只保留通用部分 4, 非必要不添加二进制文件到编译队列中 当前有一个 object.o是必要的,内容是一个空白的object.d的二进制 , 应对缺少druntime问题 5, 添加扩展功能实现放在 ext部分,使用D语言编写
前端选择D语言,编译器使用LDC.
D语言中声明 与存储位置相关
uint t1=0x11111111; // this goes to tdata TLS,有初始化
int t2; // this goes to tbss TLS
__gshared int t3=0x33333333; // this goes to data 有初始化
__gshared int t4; // this goes to bss 无初始化
shared int t5 = 0x55555555; // this goes to data 有初始化
static int t6; // this goes to bss 无初始化
shared int tt6; // this goes to bss 无初始化
注意 当前库中并未实现 TLS的功能.当前解决方式是指向bss的存储位置 注意 当前实现了malloc和free,具体实现可以查阅代码 注意 当前实现了class的构建 通过 函数模板完成的,尽量减少使用,还没做到对堆栈的自动预测分配
C* c = CreateObject!(C)();
与phobos内子目录同名|调用库简单修正,不建议从D的基础库中调用.
直接调用寄存器库
extern(C) void mloop()
{
import mculib.arm;
DRCC.enable!"CRCEN" = true;
while(1){}
}
同功能直接操作 外设总线
extern(C) void mloop()
{
import mculib.chip;
Peripherals.RCC.AHB1ENR.CRCEN = true;
while(1){}
}
D
风格的输入
CRC
(待测试验证)STK
ITM
PWR
WWDG
IWDG
RTC
UART
USART
SPI
I2C
CAN
USB
ADC
DAC
GPIO
TIM
LCD
FSMC
RNG
HASH
CRYP
EVEN
LCD
arm cortex-m
架构支持 代码详见 mculib.arm.builtins
svd工具已经重写,代码未整理,已提交上来
LDC - the LLVM D compiler. 1.1 直接安装LDC - the LLVM D compiler 就行
IDE可使用VScode,更多信息可参考我的文章.
直接使用dub构建就行了
配置dub.json,主要是追加以下配置
{
"dflags-ldc": [
"--defaultlib=", // 忽略默认
"--platformlib=", // 忽略平台库
"--link-defaultlib-shared=false", // 禁用链接共享库
"--O0", // 进制优化
"--static", // 静态链接
"--link-internally", // 内置连接器
"--function-sections",
"--data-sections",
"--Xcc=-fno-unwind-tables",
"--Xcc=-fno-exceptions",
"--Xcc=--target=arm-none-eabi",
"--debugger-tune=gdb",
"--exception-model=arm",
"-mcpu=cortex-m4" // MCU目标构架
"--fthread-model=local-exec", //initial-exec时,tls变量的offset是从got表的地址加载的
//local-exec时,tls变量的offset是直接加载立即数,此时不需要 .got
"--thread-model=single", // Single thread model
],
"lflags-ldc": [
"-T./script/STM32F401CCux_Flash.ld", // 连接器脚本
"--gc-sections",
"--threads=1",
"-nostdlib",
"--nostdlib",
"-static",
"--Bstatic",
"-znorelro",
"-marmelf",
"--oformat=elf",
"--no-fortran-common",
"--no-use-android-relr-tags",
"--no-allow-shlib-undefined",
"--no-check-sections",
"--no-demangle",
"--Map=bin/cm4.map" // 调试用 生成map文件
],
"buildOptions": [
"betterC" // 开启betterC模式
],
"toolchainRequirements": {
"ldc": "*"
}
}
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"cwd": "${workspaceFolder}",
"executable": "./tests.elf",
"name": "Debug with JLink",
"request": "launch",
"type": "cortex-debug",
"device": "STM32F401CC",
"runToEntryPoint": "Reset_Handler",
"showDevDebugOutput": "none",
"servertype": "jlink",
"interface": "swd",
"serverArgs": [
"-speed","auto", // 连接速度
"-ir",""
],
"swoConfig": {
"enabled": false,
"cpuFrequency": 160000,
"swoPort": "2553"
},
"preLaunchTask": "dub: Rebuild stm32f401cc" ,
"svdFile": "${workspaceFolder}/stm32f401cc.svd",
"preLaunchCommands": [
"monitor semihosting ThumbSWI 0xAB",
"monitor semihosting enable" // 开启semihosting
],
"showDevDebugTimestamps": false
}
]
}
烧录脚本没有实现,可自由选择烧录程序 我当前是用jlink
通过tools目录下的svd工具可以转换现有svd数据. 5.1 新版本还没由整理提交
Peripheral
内模板 ,详情查看 寄存器读写模板
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。
1. 开源生态
2. 协作、人、软件
3. 评估模型