主要内容
按键驱动
按键驱动综合使用了软定时器 + 状态机 + 邮箱数据通信。
- 软定时器负责周期性地调用按键检测扫描函数
- 状态机负责处理按键按下、弹起等状态的判断与处理
- 邮箱负责处理定时器扫描任务与调用驱动的任务之间的按键值数据通信
驱动初始化后,软定时器会自动扫描按键,然后结合状态机判断哪个按键按下或弹起,一旦检查到按键按下,则将键值投递到邮箱中。需要读取键值的任务会在邮箱上等待键值。
串口驱动
该驱动设计较为复杂。
串口发送或者接收,各自实现了一个”管道”。对于任意管道,一端写入数据,另一端读取数据。或者可以理解为一方生产,一方消费,即所谓的”生产-消费者模型”。
以串口数据发送为例,该驱动完成任务与发送中断之间的通信。
通信通过自定义的全局数据结构来实现,待发送的数据写入到循环FIFO中。然后结合信号量来实现读写的同步,使用开关中断来对全局数据的访问进行共享保护控制。
串口数据的接收,工作原理和发送类似。
可以看到,无论是发送还是接受,通过RTOS的这些功能模块能够有效地提升数据收发效率。
外部IO驱动
此部分驱动较为简单,主要是调用硬件驱动库对寄存器读写。
由于这些库的代码执行速度很快,就没有必要采用互斥信号量等实现保护,直接采用开关中断来保护更有效率。
波形生成驱动
目前代码实现非常简单,只是用调用硬件驱动库输出方波。实际还可以扩展。
这部分驱动使用互斥信号量来进行保护。