在晕哥店里捡个漏拿便宜开发板,趁现在兴致还在赶紧玩玩。由于平常使用Mac和linux环境居多,基本不在window下开发,
受海石生风大佬的帖子感觉应该可行。最近在学习RUST,不久前stable部分的组建也完善了现在用RUST开发已经不在需要
arm-none-gcc的支持可以使用llvm实现全套编译,顺便可以省下几个G的工具链。目前cortex-m下rust支持很简单,cargo-embed
可以实现管理下载编译调试一条龙,probe-rs项目也可以支持CMIS包,svd2rust可以实现基本寄存器库,配合cortex-m和
cortex-m-rt支持,点个灯还是没有问题,简单记录分享下,尝试白嫖。
1. 需要安装rust相关组建
rustup default stable #使用稳定版工具链
rustup component add llvm-tools-preview #安装llvm工具链
rustup target add thumbv8m.main-none-eabihf #安装M33标准库
cargo install cargo-embed cargo-generate cargo-binutils target-gen svd2rust #安装辅助工具集
2. 下载修改的模版到本地,在官方基础上修改为stm32f103并使用cargo-embed管理,也添加了acm32的描述文件。
可以使用CMIS的pack用target-gen生成yaml描述,具体参考probe-rs项目
已修改好项目地址: https://github.com/shaoxi2010/cortex-m-quickstart
3. 使用cargo generate生成led项目 cargo generate --git ./cortex-m-quickstart -n acm32f4-rs
4. 生成acm32f40x寄存器库信息
a.先在acm32f4-rs的同级目录下新建一个rust库,使用cargo new --lib acm32f40x创建一个lib
b.使用pack文件解压出svd文件,并将ACM32F4.svd文件拷到acm32f40x目录下
c.使用svd2rust -i ACM32F4.svd生成代码,将生成的lib.rs文件拷贝到src目录下
d.强迫症患者用rustfmt对生成文件进行重新格式化,库就算搞定了
PS:pack文件下是没有寄存器feild描述,比较坑爹,没发使用位方法,但是我看stm32是有的。。。
5. 回到led项目,将刚生成的寄存器库添加到Cargo.toml文件中
6. 其他修改参考rust的cortex-m的说明即可,可参考芯片yaml文件。
7. 在Embed.toml文件修改[default.general]下的chip = "ACM32F403RET7"
8. 写点逻辑代码编个简单的LED程序,完成。
9. 最后接上USB,连接电路板,cargo embed执行下载调试。
点灯完整项目可参考: https://github.com/shaoxi2010/acm32f4-rs
运行效果如下:
最近编辑记录 shaoxi2010 (2022-07-06 11:41:17)
离线
rust是个什么? 交叉编译工具链么?
离线
rust牛逼。
c快点完蛋吧,C语言就是语法刺客,太容易把问题遗留到测试阶段了。
离线
曾经的C小红,变成了C小黑 :|:|
离线
那个是clean后从新编译速度还行,rust的硬伤挺多的,C调用在这里面很小,因为ABI的调用规则是一样的。蛋疼反而再一些奇奇怪怪的地方,航芯的SVD里没有寄存器描述,库类型系统检查的优势完全反而弄得到处都得unsafe,算下来还不如C得头文件。格式化字符串会导致容量暴涨,这个FLASH大还好,f103上还是挺难取舍得。
离线
@shaoxi2010
rust跟C的设计思想可以说是两个极端,rust调用C虽说可行,但非常吃力。我曾想用rust调用C的UI库来进行图形开发,发现对接非常困难,可能是我的功力不够,只好做罢。
并且rust开始走C++的老路,特性非常多,代码阅读起来吃力。而C因为特性太过简单,很多人会用大量的指针来模拟面向对象,导致阅读调试也很吃力。
所以现在嵌入式领域缺少像golang那样简洁而又高级的语言。
最近编辑记录 海石生风 (2022-07-07 22:09:39)
离线
准备也测试一下
离线
rust是个什么? 交叉编译工具链么?
。。。一种编程语言,根C、python的概念是平级的。
离线
LZ听厉害的。这芯片好用么?
离线
rust跟C的设计思想可以说是两个极端,rust调用C虽说可行,但非常吃力。我曾想用rust调用C的UI库来进行图形开发,发现对接非常困难,可能是我的功力不够,只好做罢。
并且rust开始走C++的老路,特性非常多,代码阅读起来吃力。而C因为特性太过简单,很多人会用大量的指针来模拟面向对象,导致阅读调试也很吃力。
所以现在嵌入式领域缺少像golang那样简洁而又高级的语言。
@海石生风
zig和c/c++的互操作性很佳,你甚至可以拿zig做c/c++编译器。
可以试试zig,像这位一样:Build an LVGL Touchscreen App with Zig
离线
@jlau
zig一直都在关注,之前还尝试了下拿zig cc当做C交叉编译器在Linux跨平台编译AWTK到Windows平台。只不过zig当前正在进行自举且尚未完工,交叉编译能力比之前要差点,编译AWTK的源码都ok,但在链接阶段失败了。打算过段时间,等自举得差不多了再尝试。
zig现在还没实现自举,还不能在生产环境中使用。期待它早日发布1.0.0版本吧。
最近编辑记录 海石生风 (2022-10-04 13:15:19)
离线
@海石生风
你是AWTK开发人员吗?我一直觉得用zig实现gtk/glib那样规模和完善度的库是一个很好的证明自己的机会。当然gtk/glib有点大,能用zig实现AWTK也是很好的证明,有人推动一下就好了。
对于rust,从热度和复杂性来说我感觉有成为第二个c++的趋势。我比较同意这篇文章里面的说法,rust的做法有点迂腐了,减少了编程的乐趣。linux 6.1要集成rust支持了,我很想看看几年后just for fun的linus会怎么看待rust。
对于c++的继任者,我感觉google的carbon有可能更受欢迎。carbon对c++的兼容跟zig对c的兼容一样好。rust意味着重学重写,carbon和zig意味着学多一点。
离线