不能轮询FreeRTOS taskGetTickCount()吗?
我想我要么对FreeRTOS taskGetTickCount()函数的工作方式有误解,要么对我们的端口不太正确 我进行了一些调试,其中显示了xTaskGetCount()的输出。每当我执行vTaskDelayUntil()时,它似乎都已更新并且是最新的。但如果我做旋转等待,等待它增加,它永远不会。我认为触发的中断一直在滴答作响,并增加了该值。但我现在只运行一个任务,所以也许它足够聪明,永远不会检查重新安排,并且滴答数永远不会更新?如果有人能让我了解弗里尔托斯蜱虫计数法的工作原理,我将不胜感激 编辑:示例片段:不能轮询FreeRTOS taskGetTickCount()吗?,c,embedded,freertos,C,Embedded,Freertos,我想我要么对FreeRTOS taskGetTickCount()函数的工作方式有误解,要么对我们的端口不太正确 我进行了一些调试,其中显示了xTaskGetCount()的输出。每当我执行vTaskDelayUntil()时,它似乎都已更新并且是最新的。但如果我做旋转等待,等待它增加,它永远不会。我认为触发的中断一直在滴答作响,并增加了该值。但我现在只运行一个任务,所以也许它足够聪明,永远不会检查重新安排,并且滴答数永远不会更新?如果有人能让我了解弗里尔托斯蜱虫计数法的工作原理,我将不胜感激
void someTask(void * _)
{
portTickType now = xTaskGetTickCount();
for( ; xTaskGetTickCount() - now < 25; )
{
debug("%u", xTaskGetTickCount();
}
}
void someTask(void*)
{
portTickType now=xTaskGetTickCount();
对于(;xTaskGetTickCount()-现在<25;)
{
调试(“%u”,xTaskGetTickCount();
}
}
这将永远旋转,远远超过tick=1 ms时所暗示的25 ms。输出将不断地反复列出相同的值但是,在循环的底部,它会健康地增加,最终会退出。你不会说你正在使用哪个端口。从根本上说,你的代码没有问题,尽管这样做是不寻常的。循环从不阻塞,因此它会使任何执行时间的所有优先级较低的任务都处于饥饿状态,并将时间切片具有相同优先级的任务 以下是一些注意事项: 更好的解决方案是:
while( whatever )
{
vTaskDelay( 25 );
DoSomething();
}
debug()
不是FreeRTOS语句,我不知道它是如何实现的。如果您使用某种半宿主,那么调用debug()可能会使处理器(您不说是哪个)的执行延迟较长时间
vTaskDelay(25)
你有什么建议?!这不是解决办法!
VTaskDelay()是一个函数,用于在从调用VTaskDelay()开始计算的一段时间内将任务转换为锁定状态
VTaskDelayUntil()-此函数提供具有指定周期的循环执行
循环从不阻塞,因此它将耗尽任何执行时间的所有优先级任务,并将使用相同优先级的任务进行时间切片
函数vTaskDelayUntil()专门用于避免此问题!例如,我无法将此拐杖与vTaskDelay()函数放在一起,因为有一个关键的代码区域,而xTaskGetTickCount()函数总是返回0。我无法解决此问题((
几个小时后的折磨:
void StartTask01(void const * argument)
{
portTickType xLastWakeTime;
xLastWakeTime = xTaskGetTickCount();
const portTickType xPeriod = pdMS_TO_TICKS(100);
while(1)
{
canInterviewMC_100(); // Interview CAN Message
vTaskDelayUntil(&xLastWakeTime, xPeriod);
}
}
因此,此代码每100ms执行一次。同时,它具有最高优先级,但对于低优先级的任务,此任务不会占用CPU时间,因为它每100ms只执行一次。显示一段简单的代码来说明问题。稍微推断一下,设计良好的RTOS不会允许调试()调用大大延迟了调用它的线程。因此,在它再次出现之前,您将看到,哦,几十万行调试器输出。@HansPassant,但这里不是这样。我对它进行了修改,使它在调试语句之间运行长循环,它似乎仍然没有增加。最后,我们发现我们的xmega256a3端口出现问题。当端口工作时,上述功能应该可以正常工作。