C++ 底层硬件驱动开发全解析
1. 中断编程基础
在 C++ 进行底层硬件驱动开发时,中断编程是一个关键部分。中断编程中有些方面是特定于给定的微控制器和编译器的,通常无法以通用形式编写。例如,示例中断向量表中的填充字节 {0x0C, 0x94}
构成了 8 位微控制器目标上跳转操作的操作码。
编程中断的最后一步是启用中断源,通常通过直接内存访问在特殊功能寄存器中写入特殊的使能位来实现。例如,以下代码启用了 8 位微控制器目标中 timsk0
特殊功能寄存器的第 1 位,从而启用了定时器 0 的比较匹配 A 中断:
// Enable the timer0 compare match a interrupt.
mcal::reg_access<std::uint8_t,
std::uint8_t,
mcal::reg::timsk0,
0x02U>::reg_set();
2. 实现系统节拍
系统节拍是底层驱动软件中最重要的部分之一,它为整个软件项目提供时基。例如,多任务调度器就使用来自系统节拍的时基。
以 8 位微控制器的定时器 0 为例,在比较模式下向上计数,可以创建一个频率为 1 MHz 的高分辨率 32 位系统节拍。由于定时器 0 的计数器和比较寄存器为 8 位宽,32 位系统节拍需要硬件和软件结合来合成。系统节拍的低字节来自定时器 0 的计数器寄存器 tcnt0
,高 3 字节存储在变量 system_tick