gpt4 book ai didi

FreeRTOS taskGetTickCount() 可以不被轮询吗?

转载 作者:太空狗 更新时间:2023-10-29 15:36:19 25 4
gpt4 key购买 nike

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

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

编辑:示例片段:

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

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

最佳答案

您没有说您使用的是哪个端口。从根本上说,您的代码没有任何问题,尽管这样做并不常见。该循环从不阻塞,因此它将使所有执行时间较低的优先级任务处于饥饿状态,并且将对具有相同优先级的任务进行时间分片。

这里有一些注意事项:

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

while( whatever )
{
vTaskDelay( 25 );
DoSomething();
}

debug() 不是 FreeRTOS 语句,我不知道它是如何实现的。如果您正在使用某种半托管,那么调用 debug() 可能会使您的处理器(您没有说是哪个)的执行长时间停止。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com