不能轮询FreeRTOS taskGetTickCount()吗?

不能轮询FreeRTOS taskGetTickCount()吗?,c,embedded,freertos,C,Embedded,Freertos,我想我要么对FreeRTOS taskGetTickCount()函数的工作方式有误解,要么对我们的端口不太正确 我进行了一些调试,其中显示了xTaskGetCount()的输出。每当我执行vTaskDelayUntil()时,它似乎都已更新并且是最新的。但如果我做旋转等待,等待它增加,它永远不会。我认为触发的中断一直在滴答作响,并增加了该值。但我现在只运行一个任务,所以也许它足够聪明,永远不会检查重新安排,并且滴答数永远不会更新?如果有人能让我了解弗里尔托斯蜱虫计数法的工作原理,我将不胜感激

我想我要么对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端口出现问题。当端口工作时,上述功能应该可以正常工作。