两个Delay函数:
1 vTaskDelay:从调用开始计时,传入的参数就是调用本函数延时的时间,
2 vTaskDelayUntil:和xTaskGetTickCount配合使用,xTaskGetTickCount获得Tick,从获得Tick开始计时,传入参数就是从Tick开始延时的时间
使用:
void LcdPrintTask(void *params)
{
struct TaskPrintInfo *pInfo = params;
uint32_t cnt = 0;
int len;
BaseType_t preTime;
uint64_t t1, t2;
preTime = xTaskGetTickCount();
while (1)
{
/* 打印信息 */
if (g_LCDCanUse)
{
g_LCDCanUse = 0;
len = LCD_PrintString(pInfo->x, pInfo->y, pInfo->name);
len += LCD_PrintString(len, pInfo->y, ":");
LCD_PrintSignedVal(len, pInfo->y, cnt++);
g_LCDCanUse = 1;
mdelay(cnt & 0x3);
}
t1 = system_get_ns();
//vTaskDelay(500); // 500000000
vTaskDelayUntil(&preTime, 500);
t2 = system_get_ns();
LCD_ClearLine(pInfo->x, pInfo->y+2);
LCD_PrintSignedVal(pInfo->x, pInfo->y+2, t2-t1);
}
}
t2 - t1打印出来的时间是随机的,这是因为前面执行mdelay(cnt & 0x3)的时间是随机,所以vTaskDelayUntil执行的时间等于传入的500减去前面代码执行的时间
执行vTaskDelay,单纯从当前时间开始,所以打印的时间基本等于500
以上是我个人的理解,如有错误,还请大佬们指出,谢谢!