嵌入式MCU开发-裸机/RTOS的优缺点
裸机程序特点
- 轮询执行,通常为每个模块将其核心业务加入时间片周期轮询
- 从RTOS的角度理解,相当于仅有软件定时器,通过定时器超时执行 核心业务回调函数,而这个轮询时间由开发者根据实际情况设定
- 无法实现非阻塞延时,只用到MSP主堆栈,任务的上下文无法保存
RTOS程序特性
- 对于单核MCU来说,RTOS虽不是真正的并行执行,只是宏观上达到多程序并行的效果
- RTOS能较好地实现模块的分离和隔离,降低耦合,每个任务都有自己的任务栈,这对于业务开发、移植、维护较为友好
- 实时性比裸机要强,任务间通信,如事件、消息队列、信号等API阻塞 + Systick调度中断,可以使得任务执行 的实时性大大提高,而不是裸机程序的轮询执行
程序设计原则
文件、函数、变量命名
- 不同层级的文件命名、函数命名、变量命名要有标识度
分层以及模块化设计
层级之间的调用和信息上报
- 下层提供直接接口调用,提供注册回调函数,禁止调用上层接口
避免全局变量之开发设计
尽量少用多文件共享之全局变量
变量首选局部变量,其次用静态全局变量(仅能被当前文件访问),全局变量可改为指针传递
或者是导出接口或者函数指针、句柄
静态全局变量过多情况下,可用结构体统一封装,称为句柄,可作为指针传递出去
设计模式的应用
- 状态机
- 命令模式
事件与匹配函数执行的数组集
裸机开发
模块间通信
- 实时性要求不高的情况下,可以应用 类消息队列 的方式,尽量使用避免跨文件的全局变量
- 高实时性要求下,可以采用 订阅-发布模式
软件定时器的使用
- 以Systick为全局时基
RTOS开发
代码业务设计
消息队列的应用
- 阻塞式消息队列
事件的应用
多线程设计注意点
- 临界区问题
- 高实时性要求场合