FreeRTOS内核时钟不对的问题解决
内容提要
本文讨论了在使用RTOS时遇到的时钟异常问题。经过问题定位和分析,发现问题出现在configSYSTICK_CLOCK_HZ的定义上。解决办法是取消对该宏的定义。总结指出,在RTOS中出现内核时钟异常时,应首先检查Systick配置问题。
延伸解读
时钟源选择:宏定义如何改变SysTick行为
文章指出,configSYSTICK_CLOCK_HZ不仅影响重装载值计算,还会改变portNVIC_SYSTICK_CLK_BIT的取值,从而切换SysTick的时钟源。即使该宏与系统时钟频率相同,定义它仍可能导致时钟源变化,引发延时异常。这提醒开发者,宏定义可能隐含硬件行为变更,需结合寄存器配置理解其作用。
排查思路:先确认SysTick时钟源与频率
遇到RTOS延时约为预期10倍时,文章建议优先检查SysTick配置。具体应确认两点:SysTick时钟是否等于内核时钟(AHB),以及RTOS如何设置SysTick控制寄存器。通过查看CM内核SysTick寄存器的位2,可判断时钟源是内核时钟还是其8分频,避免仅关注重装载值而忽略控制寄存器。
解决方式:按官方说明决定是否定义宏
根据官方解释,configSYSTICK_CLOCK_HZ仅适用于Cortex-M内核。若SysTick与内核同频,应保持未定义;若不同频,则需同时设置configCPU_CLOCK_HZ和configSYSTICK_CLOCK_HZ为实际时钟频率。文章中的问题正是因多余定义该宏所致,取消定义后解决。因此移植时应严格对照时钟源实际情况配置。
Q&A
RTOS中vTaskDelay延时时间比预期长很多,可能是什么原因?
可能是configSYSTICK_CLOCK_HZ宏定义错误导致Systick时钟源被改变,使延时时间变为预期的10倍左右。
configSYSTICK_CLOCK_HZ宏在FreeRTOS中有什么作用?
该宏仅适用于Cortex-M处理器,用于指定Systick的时钟频率。如果Systick时钟与系统内核时钟相同,则不应定义此宏;如果不同,则需定义为Systick的实际时钟频率。
为什么定义了configSYSTICK_CLOCK_HZ后即使频率值正确也会出问题?
因为定义该宏会改变portNVIC_SYSTICK_CLK_BIT的值,从而切换Systick的时钟源(例如从内核时钟变为内核时钟的8分频),导致实际时钟频率与预期不符。
如何正确配置Systick的时钟源?
通过修改Systick控制与状态寄存器中的第2位(CLKSOURCE)来选择时钟源:1表示内核时钟,0表示内核时钟的8分频。
FreeRTOS中Systick的重装值是如何计算的?
重装值 = (configSYSTICK_CLOCK_HZ / configTICK_RATE_HZ) - 1。其中configSYSTICK_CLOCK_HZ应为Systick的实际时钟频率,configTICK_RATE_HZ为RTOS tick频率。
解决FreeRTOS内核时钟异常的具体步骤是什么?
取消对configSYSTICK_CLOCK_HZ的定义即可。因为当Systick时钟与内核时钟相同时,无需定义该宏,定义反而会改变时钟源导致问题。