4

我想我要么 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() ,它会健康地增加,并最终退出。

4

2 回答 2

3

你没有说你正在使用哪个端口。从根本上讲,您的代码没有任何问题,尽管做这种事情是不寻常的。循环永远不会阻塞,因此它将使任何执行时间的所有低优先级任务饿死,并将与具有相同优先级的任务进行时间切片。

以下是一些注意事项:

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

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

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

于 2012-12-22T08:41:57.560 回答
0

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);
  }
}

因此,此代码每 100 毫秒执行一次。同时,它的优先级最高,但是对于低优先级的任务,这个任务不会占用 CPU 时间,因为它每 100ms 只执行一次。

于 2017-07-20T12:53:37.253 回答