系统节拍是非常重要的一个设备,在早期的MCU51和ARM7芯片中,没有专门的系统节拍,往往由一路硬件定时器来实现其功能,到了Cortex系列,ARM提供了Systick硬件定时器专门用于系统节拍,可见现在的编程对系统节拍的依赖性。
系统节拍的概念比较早的出现在OS中,产生固定间隔的重复中断,用于任务的超时等待或者任务延时多少个节拍周期用。在前后台系统中,也引入了系统节拍,比如msOS-Mcu51版本很早就引入了系统节拍,实现按键扫描、虚拟定时器等功能。此外还有一种基于时间片编程的架构,直接采用系统节拍来处理一些对时间精度要求比较高的需求。常用时间间隔是5mS或者10mS,也就是说每秒钟200次或者100次节拍。随着处理器速度的提高,尤其是在一些控制要求高的地方,可以采用1mS,msOS甚至采用了0.1mS的高频率系统节拍。这个具体的时间间隔跟项目需求有关,可以根据自己的项目灵活配置,但在满足需求的情况下,不建议设置的太高,否则影响处理器效率。
msOS中的很多设备,都需要基于系统节拍来运行,比如按键、软件定时器。这些设备不需要太高的系统时钟,按键只需要每秒钟100次,软件定时器需要每秒钟1000次节拍,但msOS因为面向时间精度要求比较高的行业,所以默认的系统节拍时间间隔设置的很短,达到0.1ms,也就是说一秒钟一万次节拍。所以需要对系统节拍进行分频处理,但因为系统节拍真实的间隔是0.1ms,以STM32工作在72MHz为例,这么短的时间最多只能执行7200个CPU指令,为了防止各个低速设备都挤在同一个系统节拍内运行,超过7200个指令,所以在分频的时候,不要把所有的设备都放在同一个节拍里面,需要把各个设备分散到各个节拍中运行。
Device_systick.c是系统节拍设备,它除了分散节拍直接调用固定的运行在其上的设备外,还提供了注册机制给上层应用程序提供系统节拍,具体如下:
定时器是一个项目中经常用到的设备,比如动画设计、闹钟、定时工作、超时处理等。然而一个处理器往往自带的硬件定时器是非常有限的,并且功能也比较有限,不能灵活应用,所以需要通过系统节拍虚拟出多路软件定时器。
软件定时器主要定时器服务、启动、停止三个函数组成,默认支持8个软件定时器,以下面代码为例加以说明。
FunctionCallback为定时器超时后的回调执行函数,是软件定时器初始化的第三个参数,超时时间到就执行这个函数,第二个参数1000为超时的时间,单位是软件定时器的系统时钟,msOS采用的是1mS,1000也就是一秒钟。第一个参数为回调函数执行的位置,TimerMessageHandle表示在业务逻辑中执行,适合处理代码量大的,处理时间长的函数。TimerSystickHandle表示在系统节拍中直接处理,系统节拍内一般适合代码量少的,处理时间短的函数。软件定时器功能非常有用,它的结构也非常简单,用户看懂之后可以任意扩展其功能完成自己特殊的用途。