1 Star 0 Fork 4

渡世白玉 / mculib4d

forked from 赵维鹏 / mculib4d 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

mculib4d

更新记录

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)();

目录结构

mculib arch|Arch 目录,当前目录下包括一些Arch支持的杂项 arch.***|Arch 支持 chips|mcu 芯片型号对应 stdlib|本库自身支持 与phobos内子目录同名|调用库简单修正,不建议从D的基础库中调用.

直接调用寄存器库

import chips;
extern(C) void mloop() 
{
    RCC.CR.PLLI2SON = 0x00 ;  // 这里可以直接使用寄存器 所有寄存器由 **Register_(T)**结构 实现
    while(1){}
}

现有完成

svd工具已经重写,代码未整理,未提交上来

自定义中断函数方式

安装教程

  1. 不需要了 编译器需 LDC,开发用版本为 1.24/DMD v2.094.1,因 LDD的BUG不能由ldc直接输出bin文件,需要使用 arm-none-eabi 的LD 和 objcopy.LDC2可以输出不使用abi LTS的方案. 1.1 直接安装LDC - the LLVM D compiler (1.31.0)就行
  2. IDE可使用VScode,更多信息可参考我的文章.
  3. 不需要了 windows的host平台编译实现代码在 bu2.cmd中,linux的编译脚本我未实现 3.1 直接使用dub构建就行了
  4. 烧录脚本我没有实现,可自由选择烧录程序 我当前是用jlink
  5. 不需要了通过tools目录下的svd工具可以转换现有svd数据. 5.1 新版本还没由整理提交

说明

  1. 代码可自由使用,商业发布请注明来源
  2. 二次发布请告知我一下,一同开心
  3. xxxx其他的想到再写

参与贡献

  1. 开发参考的硬件为 STM32F401CC,和芯片相关的手册
  2. 代码参考 wiki ,
  3. 有讨论的发issues
  4. 开发中使用的一些不常用技巧汇总在我的博客 .
  5. target 设定 https://clang.llvm.org/docs/CrossCompilation.html
  6. 开发库生成 https://github.com/ARM-software/LLVM-embedded-toolchain-for-Arm

特技

  1. 使用 Readme_XXX.md 来支持不同的语言,例如 Readme_en.md, Readme_zh.md
  2. Gitee 官方博客 blog.gitee.com
  3. 你可以 https://gitee.com/explore 这个地址来了解 Gitee 上的优秀开源项目
  4. GVP 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
  5. Gitee 官方提供的使用手册 https://gitee.com/help
  6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 https://gitee.com/gitee-stars/

更新记录

  • 2023年3月18日:提交了新的构架版本,放弃原有的结构.TLS直接调用BSS的对象,也就是没有TLS管理.替换原来的寄存器管理派生,采用static interface 及其模板化方式实例化 外设寄存器操作.支持class的操作(当前无应用,后面要做硬件功能寄存器的分时复用).当前问题是生产的代码量较大,不适合需要尺寸优化场合..(这种场合还多么...去用CC吧,就差那几分钱啊).
  • 2021年4月9日: 开了个公司,主营是原型机开发(机械),更新这边的时间不会太多.
  • 2021年2月11日:更新 Peripheral 内模板 ,详情查看 寄存器读写模板
  • 2021年2月6日:更新目录树结构
  • 2021年2月5日:增加自定义中断函数的方式
  • 2021年2月3日:增加了一个svd转换用代码,详见tools目录下的svd.d .
  • 2021年2月2日:精简了一下生成方案,控制一下单文件的总行数,不然vscode有些不正常.
  • 2021年1月19日: 基本完成 peripheral 模板,通过简单测试 可正常应用.

空文件

简介

D语言原生的arm操作库,以简单调用,简化调用,通用封装为目标. 当前状态在stm32f401上验证通过, 目标是以最大限度简化单片机编程过程 展开 收起
D
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
D
1
https://gitee.com/dushibaiyu/mculib4d.git
git@gitee.com:dushibaiyu/mculib4d.git
dushibaiyu
mculib4d
mculib4d
master

搜索帮助