FreeRTOS 配置TICK_RATE_HZ

Posted

技术标签:

【中文标题】FreeRTOS 配置TICK_RATE_HZ【英文标题】:FreeRTOS configTICK_RATE_HZ 【发布时间】:2011-01-15 23:47:31 【问题描述】:

我正在使用带有 FreeRTOS 5.4 版的 MSP430f5438。

我遇到了一个我想不通的有趣问题。

基本上,当我将 configTICK_RATE_HZ 设置为不同的值时,LED 会更快或更慢地闪烁;它应该保持不变。我将 configTICK_RATE_HZ 设置得越高,它就会闪烁得越慢,而当我将 TICK_RATE 设置得越低时,它就会闪烁得越快。

vTaskDelayUntil( &xLastFlashTime, xFlashRate );这样无论 configTICK_RATE_HZ 是什么,LED 都应该每秒闪烁一次。我一步一步检查了 xFlashRate 以确保。它总是 = 到 configTICK_RATE_HZ。 代码:

xFlashRate = ledFLASH_RATE_BASE;//my flash base rate is 1000ms
xFlashRate /= portTICK_RATE_MS; //so xFlashrate = whatever configTICK_RATE_HZ equals

/* We need to initialise xLastFlashTime prior to the first call to vTaskDelayUntil().*/ 
xLastFlashTime = xTaskGetTickCount();
for(;;)  
vTaskDelayUntil( &xLastFlashTime, xFlashRate ); vParTestToggleLED( uxLED ); 
flashled();//this should happen every 1 second.

当我将 configtick_rate_hz 设置为 1000 时,LED 闪烁的周期大于 1 秒,而当我将滴答率设置为小于 ~200 时,LED 闪烁的周期远小于 1 秒

configTICK_RATE_HZ 不应影响 LED 闪烁时间。

我意识到需要更多信息,并且会随时提供任何需要帮助的代码 sn-ps。

【问题讨论】:

我认为你需要清楚。您的测试引用了 configTICK_RATE_HZ,但您的代码引用了 configTICK_RATE_MS,并且您没有给出 ledFLASH_RATE_BASE 的值。 RATE 一词表示频率,但 MS 表示周期。它是哪一个?价值观是什么。 为什么当你改变滴答频率时你的系统频率改变了? @mocj:他很惊讶,因为他认为他已经计算出延迟以补偿变化的滴答率。他没有。 澄清 - 1) xFlashRate 是要延迟的 RTOS 滴答数。 2)ledFLASH_RATE_BASE 是您想要的以毫秒为单位的周期。 3)portTICK_RATE_MS 是 RTOS 滴答的周期。它源自 configTick_RATE_HZ (1000/configTICK_RATE_HZ)。 4)so:如果您希望 LED 每秒滴答一次(1000 毫秒)并且 RTOS 每 250 毫秒滴答一次,那么您希望延迟为 4 个 rtos 滴答声。 你为什么不通过编辑帖子而不是通过评论来澄清? 【参考方案1】:

RTOS 滴答由定时器中断生成。计时器设置(不正确),无论您设置什么 configTICK_RATE_HZ,它总是会导致 400kHz 的固定滴答声。由于闪烁率是在 RTOS 滴答率由 configTICK_RATE_HZ (portTICK_RATE_MS = 1000/configTICK_RATE_HZ) 正确表示的假设下设置的,因此出现了问题。

【讨论】:

为什么不正确?使用 sysTick 以外的计时器的关键在于,即使 CPU 时钟停止,它也会以相同的速率保持计时。

以上是关于FreeRTOS 配置TICK_RATE_HZ的主要内容,如果未能解决你的问题,请参考以下文章

使用 GCC (ARM) 配置 FreeRTOS

Arduino与FreeRTOS-FreeRTOS配置与简单任务创建

CubeMX使用FreeRTOS编程指南

CubeMX使用FreeRTOS编程指南

freeRTOS&LVGL|在使用freertos时如何为lvgl配置心跳和任务管理器

FreeRTOS学习笔记4