我想我要么 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/