快捷搜索: 脱发

Rust嵌入式开发开源环境概览(零散的一些知识点)

此文档为学习笔记,学习的是B站嵌入式开发相关内容,感谢up主爆米花胡了。

Rust嵌入式开发开源环境概览

开源项目的一些重要组成部分

这个网址是开源项目:https://github.com/rust-embedded/大家可以去看看,大概分成以下几个主要部分: 1.the resource team:编写各种相关的文档,有一本具有领导意义的书籍:the embedded rust book。 2.the tools team:负责开发与嵌入式相关的工具,例如有个很重要的svd2rust工具(代码生成工具,封装寄存器读写相关的API)就是他们维护的。 3.the HAL team:HAL就是硬件抽象层,这个部分就是OS和硬件的中间层,作用很大。有embedded-hal和embedded-dma等等库。 4.the cortex-M team:负责维护和cortex-m内核有关的生态,可以提供如cortex-m、cortex-m-rt等相关的crate。这些crate可以直接操作cortex内核的寄存器,并提供中断处理的相关API。

开发生态一览图

这个图呢就是一个项目的层级依赖关系,上级依赖下级,下级为上级提供库的支持。 从下往上来说,首先是底层的硬件,就是具体的MCU物理器件。往上是PAC(外围设备通道库)和Cortex内核相关的库,这两个是同时存在的, PAC库操作的是关于外设的寄存器,微处理架构库操作的是关于架构的寄存器。然后到HAL的Traits,这里只是定义了一些接口traits,具体的实现在HAL impl中,直接调用下层。有两个Driver层,底下那个肯定就是调用下两个操作寄存器相关,上面那个不仅可以调用PAC和微架构库,还可以调用HAL的库。

SVD2rust

嵌入式开发的最基本最底层的工作,就是读写寄存器,因此,PAC是整个开发中最基础的组件,PAC代码重复度很高,且有非常规范的格式,人工编写麻烦,所以PAC代码往往由工具自动生成,svd2rust就是这样一个工具。 编译器:使用rustc,由于是交叉编译,所以需要指定target。 连接器:使用LLVM的lld工具,在嵌入式开发中,需要提供自己的链接脚本,通常以.x为后缀的文件。

架构概念图

左边是代码的依赖关系,右边是开发的环境。

开源开发环境和keil开发环境

vscode只是一个编辑器,可以标记断点的位置,真正的调试是通过调试插件来完成的,GDB是用来本地开发的,自身并不支持交叉编译的调试,这里就需要加入一个中间层,也就是GDB-Server,如下图所示: 为什么用GDB,而不用LLDB? Rust代码编译的过程实际上是通过LLVM进行的,在搭建环境的时候虽然安装了ARM-GCC工具链,但实际上并不是要用GCC,只是为了使用里面提供的GDB工具。实际上,LLVM提供了LLDB,但是应该不稳定,所以还是用GDB好一些。

经验分享 程序员 微信小程序 职场和发展