FreeRTOS配置TICK_RATE_HZ。

3
我正在使用MSP430f5438和FreeRTOS 5.4版本。但是我遇到了一个奇怪的问题,无法解决。
基本上,当我将configTICK_RATE_HZ设置为不同的值时,LED的闪烁速度会变快或变慢;它应该保持相同的速率。当我将configTICK_RATE_HZ设置得更高时,它会闪烁得更慢,而当我将TICK_RATE设置得更低时,它会闪烁得更快。
vTaskDelayUntil(&xLastFlashTime,xFlashRate)使LED每秒只闪烁一次,无论configTICK_RATE_HZ设置为什么。我已经逐步检查了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秒,而当我将tick rate设置为小于~200时,LED的闪烁周期远小于1秒。

configTICK_RATE_HZ不应影响LED闪烁时间。

我意识到需要更多信息,并会随时提供所需的代码片段来帮助解决问题。


我认为你需要更明确一些。你的测试涉及到configTICK_RATE_HZ,但你的代码涉及到configTICK_RATE_MS,而且你没有给出ledFLASH_RATE_BASE的值。RATE这个词意味着频率,但MS意味着周期。到底是哪一个?这些值是多少? - Clifford
@mocj: 他感到惊讶是因为他相信自己已经计算出了延迟以弥补不同的tick率。但实际上并没有。 - Clifford
请记住,速率(或频率)是周期的倒数。vTaskDelayUntil()接受一个周期而不是速率。您的命名不明确,我怀疑您的值不正确。如果您在使用速率时意味着周期,或者反之亦然,那么它很可能无法按照您的预期工作。 - Clifford
1
澄清 - 1)xFlashRate是RTOS延迟的滴答数。 2)ledFLASH_RATE_BASE是您想要的周期(以毫秒为单位)。 3)portTICK_RATE_MS是RTOS滴答的周期。它是从configTick_RATE_HZ(1000 / configTICK_RATE_HZ)派生出来的。 4)因此:如果您希望LED每秒(1000ms)闪烁一次,并且RTOS每250ms进行一次滴答,则希望延迟为4个RTOS滴答。 - michael
1
你为什么不通过编辑帖子来澄清,而是通过评论呢? - Clifford
显示剩余6条评论
1个回答

5
RTOS滴答是由定时器中断生成的。该定时器被设置(不当地)以使其始终在400kHz时产生固定的滴答,无论您将configTICK_RATE_HZ设置为多少。由于闪烁速率是在假定RTOS滴答率由configTICK_RATE_HZ(portTICK_RATE_MS = 1000 / configTICK_RATE_HZ)正确表示的情况下设置的,因此出现了问题。

为什么不适当?使用定时器而不是sysTick的关键在于,即使CPU时钟停止,它仍以相同的速率持续滴答作响。 - ZiglioUK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接