我想我要么 a) 对 FreeRTOS taskGetTickCount() 函数的工作方式有误解,要么 b) 我们的端口不太正确。

我有一些调试,我正在显示 xTaskGetCount() 的输出。每当我完成 vTaskDelayUntil() 时,它似乎都已更新并且是最新的。但是如果我做一个旋转等待,等待它增加,它永远不会。我认为中断会触发并增加该值。但我目前只运行一项任务,所以也许它足够聪明,从不检查重新安排并且 tickCount 永远不会更新?任何可以让我直接了解 FreeRTOS 滴答计数如何工作的人,我都会非常感激。

编辑:一个示例片段:

void someTask(void * _)
{
    portTickType now = xTaskGetTickCount();
    for( ; xTaskGetTickCount() - now < 25; )
    {
        debug("%u", xTaskGetTickCount();
    }
}

这将永远旋转,远远超过tick = 1 ms时隐含的25 ms。输出将不断地一遍又一遍地列出相同的值。如果我在循环的底部添加一个 vTaskDelay(),它会健康地递增,并最终退出。

最佳答案

你没有说你正在使用哪个端口。从根本上说,您的代码没有任何问题,尽管这样做很不寻常。循环永远不会阻塞,因此它将使任何执行时间的所有低优先级任务都处于饥饿状态,并将对相同优先级的任务进行时间切片。

以下是一些注意事项:

这个问题的更好解决方案是:

while( whatever )
{
    vTaskDelay( 25 );
    DoSomething();
}
debug() 不是 FreeRTOS 语句,我不知道它是如何实现的。如果您使用的是某种半托管,那么调用 debug() 可能会导致您的处理器(您不说是哪个)的执行长时间拖延。

关于可以不轮询 FreeRTOS taskGetTickCount() 吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13997953/

10-11 16:19