一个好的工程架构和代码规范是项目成功的基础。它可以提高代码的可读性、可维护性和可移植性。本篇分享嵌入式工程架构设计和代码规范的实践经验。一、工程架构设计嵌入式工程的架构设计需要考虑以下几个方面。第一是硬件抽象。将硬件相关的代码和业务逻辑分离。这样更换硬件时只需要修改底层驱动。第二是模块化。将功能拆分成独立的模块每个模块负责特定的功能。第三是可移植性。代码应该尽量不依赖具体的硬件平台。方便在不同的 MCU 之间迁移。第四是可测试性。代码应该方便单元测试和集成测试。二、分层设计思想分层设计是嵌入式工程中最常用的架构模式。通常将工程分为以下几层。硬件抽象层 HAL硬件抽象层是最底层。它直接操作硬件寄存器向上提供统一的接口。这一层的代码和具体的 MCU 强相关。更换 MCU 时需要重写这一层。硬件抽象层包括 GPIO、UART、SPI、I2C、定时器等外设的驱动。驱动层 Driver驱动层在硬件抽象层之上。它封装了具体的硬件操作提供更高级的接口。比如 LED 驱动、按键驱动、显示屏驱动等。驱动层的代码和具体的外设相关但和业务逻辑无关。业务逻辑层 Application业务逻辑层是最上层。它实现具体的功能逻辑。比如数据采集、协议处理、控制算法等。业务逻辑层应该尽量不直接操作硬件。而是通过驱动层提供的接口来访问硬件。这样可以提高代码的可移植性和可测试性。中间件层 Middleware中间件层位于驱动层和业务逻辑层之间。它提供一些通用的功能模块。比如操作系统、文件系统、协议栈、GUI 等。中间件层是可选的根据项目需要决定是否使用。三、代码规范良好的代码规范可以让团队协作更顺畅。也方便自己日后维护代码。以下是一些常用的代码规范。命名规范命名规范是代码规范中最重要的部分。第一变量名使用小驼峰命名法。比如 ledState、countValue。第二函数名使用大驼峰命名法或下划线命名法。比如 LED_Init 或 led_init。第三宏定义和常量使用全大写加下划线。比如 LED_PIN、MAX_COUNT。第四结构体类型名以 TypeDef 结尾。比如 GPIO_InitTypeDef。第五文件名使用小写加下划线。比如 led_driver.c。注释规范注释是代码的重要组成部分。第一每个文件开头要有文件头注释。说明文件的功能、作者、创建日期等。第二每个函数要有函数注释。说明函数的功能、参数、返回值。第三复杂的逻辑要有行内注释。说明为什么这样做而不是做了什么。第四注释要准确、简洁不要写废话。格式规范代码格式要统一方便阅读。第一使用 4 个空格缩进不要使用 Tab。第二大括号单独占一行或者紧跟在语句后面。但整个项目要统一。第三运算符两边加空格。第四逗号后面加空格。第五每行代码不要太长一般不超过 80 个字符。四、模块化设计模块化设计是提高代码可维护性的关键。每个模块应该遵循以下原则。单一职责原则每个模块只负责一个功能。不要把不相关的功能放在同一个模块中。比如 LED 模块只负责 LED 的控制。不要把按键的逻辑也放进去。高内聚低耦合模块内部的代码应该紧密相关。模块之间的依赖应该尽量少。模块之间通过接口通信不直接访问对方的内部数据。接口稳定模块对外提供的接口应该保持稳定。接口一旦定义尽量不要修改。如果需要修改要考虑对其他模块的影响。可配置模块应该尽量可配置。通过宏定义或配置参数来适应不同的需求。而不是通过修改代码来实现。五、可移植性设计可移植性是指代码在不同硬件平台之间迁移的难易程度。提高可移植性可以减少重复开发工作。硬件抽象将所有硬件相关的代码封装在硬件抽象层中。业务逻辑层不直接操作硬件寄存器。这样更换硬件平台时只需要修改硬件抽象层。使用标准类型使用 uint8_t、uint16_t、uint32_t 等标准类型。不要使用 int、char 等长度不确定的类型。这样可以避免不同平台上数据长度不一致的问题。配置文件将硬件相关的配置放在单独的配置文件中。比如引脚定义、时钟频率等。这样修改硬件配置时不需要改动驱动代码。避免使用编译器特性尽量使用标准 C 语言的语法。避免使用特定编译器的扩展特性。比如内联汇编、编译器指令等。如果必须使用要用条件编译包裹起来。六、调试与测试调试和测试是保证代码质量的重要手段。串口调试串口是嵌入式开发中最常用的调试工具。通过串口输出调试信息可以快速定位问题。建议封装一个调试打印函数。方便统一控制调试信息的输出。LED 指示在没有串口的情况下可以用 LED 指示程序状态。比如 LED 闪烁表示程序正常运行。LED 常亮表示程序出错。断言使用断言可以在开发阶段快速发现问题。在发布版本中可以关闭断言以提高性能。单元测试对关键模块进行单元测试。可以保证模块的功能正确性。在修改代码后运行单元测试。可以快速发现引入的新问题。七、版本管理版本管理是团队协作的基础。推荐使用 Git 进行版本管理。提交规范每次提交要有清晰的提交信息。说明本次提交修改了什么。不要一次提交太多不相关的修改。分支管理使用分支来隔离不同的功能开发。主分支保持稳定。功能开发在单独的分支上进行。开发完成后合并到主分支。标签管理对发布的版本打标签。方便回溯和维护。小结本篇分享了嵌入式工程架构和代码规范的实践经验。包括分层设计、代码规范、模块化设计、可移植性设计、调试测试和版本管理。一个好的工程架构和代码规范可以大大提高开发效率和代码质量。这也是从入门到进阶的必经之路。本系列文章到此结束。感谢你的阅读希望对你有所帮助。