Tra*_*ggs 5 c embedded freertos
我想我要么 a) 对 FreeRTOS taskGetTickCount() 函数的工作方式有误解,要么 b) 我们的端口不太正确。
我进行了一些调试,其中显示了 xTaskGetCount() 的输出。每当我执行 vTaskDelayUntil() 时,它似乎都会更新并且是最新的。但如果我进行旋转等待,等待它增加,它永远不会增加。我认为中断会触发并增加该值。但我现在只运行一项任务,所以也许它足够聪明,从不检查重新安排并且tickCount永远不会更新?如果有人能够让我了解 FreeRTOS 滴答计数的工作原理,我将不胜感激。
编辑:示例片段:
void someTask(void * _)
{
portTickType now = xTaskGetTickCount();
for( ; xTaskGetTickCount() - now < 25; )
{
debug("%u", xTaskGetTickCount();
}
}
Run Code Online (Sandbox Code Playgroud)
这将永远旋转,远远超过当刻度 = 1 毫秒时暗示的 25 毫秒。输出将不断地一遍又一遍地列出相同的值。如果我将 vTaskDelay() 添加到循环的底部,它将健康地增加,并最终退出。
小智 4
你没有说你正在使用哪个端口。从根本上讲,您的代码没有任何问题,尽管这样做并不常见。该循环永远不会阻塞,因此它会使任何执行时间的所有较低优先级任务都处于饥饿状态,并对相同优先级的任务进行时间切片。
以下是一些注意事项:
对于这个问题,更好的解决方案是:
while( whatever )
{
vTaskDelay( 25 );
DoSomething();
}
Run Code Online (Sandbox Code Playgroud)
debug()不是 FreeRTOS 声明,我不知道它是如何实现的。如果您使用某种半托管,那么调用 debug() 可能会长时间拖延处理器的执行(您没有说是哪个)。