13.6.1 时钟节拍

更新于 2026年10月10日 版权声明
13.6.1 时钟节拍

FreeRTOS需要提供周期性信号源,用于实现时间延时和确认超时。节拍为10~1 000次/s,或者说频率为10~1 000 Hz。时钟频率越高,系统的额外负荷越重。时钟节拍的实际频率取决于应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自交流电源的信号。

使用时应特别注意,必须在多任务系统启动以后,也就是调用vTaskStartScheduler()函数之

图示

图13.17 FreeRTOS中的时钟节拍示意图

图示

参数configSYSTICK_CLOCK_HZ表示系统时钟频率,HAL库函数中可以用函数获取,例如,后,再开启SysTick。换句话说,调用vTaskStartScheduler()函数之后应做的第一件事是初始化图13.17FreeRTOS中的时钟节拍示意图SysTick中断。通常容易犯的错误是允许将SysTick中断放在系统初始化函数之后,在多任务系统启动函数之前,这样就可能导致任务还没有创建就已开始调度工作。

FreeRTOS中的时钟节拍服务是通过在节拍定时中断服务子程序(通常是10 ~1 000 ms之间定时)中调用xTaskIncrementTick()函数实现的,FreeRTOS 中的时钟节拍示意图如图13.17 所示。xTaskIncrementTick()函数跟踪所有任务的定时器以及超时时限。在ARM Cortex - M3 中有一个24 位的节拍定时器SysTick用于该服务,其中断服务程序中调用xTaskIncrementTick()函数。当定时时间到时,就调用一次xTaskIncrementTick()函数和进行一次时间片轮转调度。

1.时钟节拍初始化函数

在FreeRTOS 中将SysTick 初始化,采用基于寄存器的配置方式以适应于不同的应用,比如可用STM32F1 系列MCU 的标准库函数,也可以用HAL 库函数。读者也可以根据其他应用库函数修改,如HAL_ SYSTICK_ Config()函数。

初始化程序如下。SystemCoreClock=HAL_RCC_GetSysClockFreq()。参数configTICK_RATE_HZ表示节拍数。(https://www.daowen.com)

例如,要定时T秒,系统时钟为configSYSTICK_CLOCK_HZ,计数次数为N,则有:

T=(1/configSYSTICK_CLOCK_HZ) *N

1/configTICK_RATE_HZ=(1/configSYSTICK_CLOCK_HZ) *N

N=configSYSTICK_CLOCK_HZ/configTICK_RATE_HZ

所以,SysTick的初值=configSYSTICK_CLOCK_HZ/configTICK_RATE_HZ-1。

如应用中设置时钟节拍数configTICK_RATE_HZ=1 000,即时钟周期为1 ms。

2.时钟节拍中断服务程序

时钟节拍中断服务程序源码如下。

图示

该段程序通过调用xTaskIncrementTick()函数检查任务的延时节拍,调整就绪列表。若有高优先级任务从阻塞态到就绪态,则执行一次调度。

↑上一章 ↓下一章
关注公众号获取验证码
复制内容需要验证码(7.99元/天)