如何使用UNIX工具构建可靠的ARM裸机固件
2023年10月10日
对于软件开发人员来说,硬件和固件的世界可能是一次令人兴奋的转变。固件将你的逻辑弹射到物理世界。你不再是处理表单和数据库之间的文本,而是可以驱动电机。你不再是监听API调用,而是可以监听声纳或GPS信号。
这是我刚开始嵌入式开发时希望拥有的指南。它从一开始就培养专业的嵌入式编程习惯。我们将跳过像Arduino这样的初学者生态系统,通过裸机编程来充分利用硬件。
这种底层方法允许你:
- 根据项目需求从各种芯片中选择。
- 如果需要,可以使用实时操作系统(RTOS)来代替“超级循环”,以实现更自然的多任务处理。
- 充分利用硬件资源。没有Arduino,也没有嵌入式Linux。项目几乎可以实现即时启动。
- 通过使用更小的软件栈来避免中间库中的错误。
- 能够进行断点和检查变量、寄存器的全远程调试。
- 在必要时,为安全关键系统实现MISRA合规性。
我们特别针对流行的ARM架构。虽然示例使用的是意法半导体(STMicroelectronics)的硬件,但我们避开了他们的供应商集成开发环境(IDE)和硬件抽象层(HAL)。本指南中的原理适用于任何ARM供应商的芯片。我们将使用Unix环境(如BSD、Linux或macOS)中完全开源的工具,而不是专有的IDE和库。原因如下:
- 你的项目不会“位腐烂”。一旦构建成功,它将在未来几年内持续构建。
- 利用成熟的工具集,如POSIX Make、C99、GCC/LLVM和GDB/LLDB。它们要么已经在你的系统上,要么可以通过操作系统包管理器轻松安装。
- 使用无处不在的CMSIS硬件接口。ARM通过合同约束其硬件供应商为其产品提供CMSIS实现。
- 让官方手册而非第三方库成为真实性的来源。CMSIS中的寄存器名称与硬件参考手册中的术语相匹配。
使用强大的工具链和库基础,我们将以四种不同的方式构建同一个简单的“闪烁LED”项目。我们将了解CMSIS与标准库crt0系统的启动序列。我们将尝试使用和不使用RTOS来编写程序,并尝试动态与静态内存分配。我们还将看到一个故障处理程序的示例,以及如何进行远程调试。
到本指南结束时,你可以充满信心地开始构建、刷写和调试更复杂的项目。本指南基于产品数据手册和基本原理构建示例,而不是复制现有的演示或代码片段。
下载下面的指南。仅需一个三明治的价格,你就可以快速上手。