【发布时间】:2017-01-14 16:28:24
【问题描述】:
我有一个问题,vTaskDelayUntil() 函数没有延迟但立即完成。代码如下:
TickType_t xLastWakeTime = xTaskGetTickCount();
while(1){
if (xSemaphoreTake(xSemaphoreRS485, portMAX_DELAY) == pdTRUE) {
printf("S display data %d\n", xTaskGetTickCount());
sendDisplayData();
printf("E display data %d\n", xTaskGetTickCount());
xSemaphoreGive(xSemaphoreRS485);
printf("W display data %d\n", xLastWakeTime);
vTaskDelayUntil(&xLastWakeTime, 2000);
}
}
由此我得到以下输出:
S display data 29928
E display data 30534
W display data 3919
S display data 30534
E display data 31140
W display data 5919
S display data 31140
E display data 31746
W display data 7919
S display data 31746
E display data 32352
W display data 9919
函数 sendDisplayData() 执行大约需要 670 毫秒,xTaskGetTickCount() 确认它。然后任务应该等待大约 1230 毫秒,因此整个迭代可能需要 2000 毫秒。但是 vTaskDelayUntil() 立即完成。第一次执行在 30534 结束,第二次也从 30534 开始。 xTaskGetTickCount() 返回的值证明 vTaskDelayUntil() 没有引入延迟。我也可以通过 sendDisplayData() 的输出频率看到它。
第二个有趣的事情是 xLastWakeTime 显示完全不同的值,这些值实际上增加了 2000。它不应该存储 xTaskGetTickCount() 返回的相似值吗?
【问题讨论】:
-
你的配置文件中有#define INCLUDE_vTaskDelayUntil 1 吗?你确定你没有重新定义 TickType_t 让我们说签名 16 位?尝试移动 TickType_t xLastWakeTime = xTaskGetTickCount();如果使用信号量后,它现在会显示正确的值吗? (我知道它不会仅仅为了简单地检查你想要的,这是否是因为在第一次到达 vTaskDelayUntil 时你已经超过了 xLastWakeTime+2000。
-
是的,我有这个定义,TickType_t 是 32 位类型。移动 xLastWakeTime 的声明和初始化有帮助!我想知道怎么做。当然,我的原始代码并不完美,因为接收信号可能需要 10 秒,并且第一个 vTaskDelayUntil() 会立即退出。但我仍然不知道为什么在第二次迭代中该变量设置为 5919 而不是 30534。