vTaskDelayUntil与vTaskDelay:
① vTaskDelayUntil精度比vTaskDelay高
② 使用vTaskDelayUntil的任务不会丢失任务执行,vTaskDelay会丢失执行。
如下代码:
Task2使用vTaskDelayUntil延时1s,Task3使用vTaskDelay延时1s,
优先级最高的Task1长期占用CPU(大概3秒),导致Task2和Task3得不到运行机会,
当Task1三秒之后释放CPU的占用,Task2和Task3得到运行机会,Task3只会运行1次,但Task2将会连续运行3次。
#include "user_task.h"
#define DELAY_LOOP_CNT 3000000000
static TaskHandle_t Task1;
static TaskHandle_t Task2;
static TaskHandle_t Task3;
void vTask3(void *pvParam)
{
const char *pcTaskName = "{Task}------3\r\n";
// volatile unsigned long u3;
pvParam = pvParam;
for (;;)
{
printf("%s", pcTaskName);
/*for (u3 = 0; u3 < DELAY_LOOP_CNT; u3++)
{
}*/
vTaskDelay(1000);
}
}
void vTask2(void *pvParam)
{
int cnt = 0;
const char *pcTaskName = "[Task]----2\r\n";
// volatile unsigned long u2;
TickType_t lasttick = xTaskGetTickCount();
pvParam = pvParam;
for (;;)
{
printf("%s", pcTaskName);
vTaskDelayUntil(&lasttick, 1000);
//vTaskDelay(1000);
if (cnt < 3)
{
cnt++;
}
else
{
/* if (uxTaskPriorityGet(Task1) == 1)
{
printf("Change Task1 priority!\r\n");
vTaskPrioritySet(Task1, 4);
}*/
}
}
}
void vTask1(void *pvParam)
{
const char *pcTaskName = "<Task>--1\r\n";
volatile unsigned long u1 = 0;
pvParam = pvParam;
for (;;)
{
printf("%s", pcTaskName);
for (u1 = 0; u1 < DELAY_LOOP_CNT; u1++)
{
}
//vTaskDelay(1000);
// printf("%C", getch());
vTaskDelay(100);
// taskYIELD();
}
}
void vTask_main(void)
{
xTaskCreate(vTask1, "Task1", 1000, NULL, 4, &Task1);
xTaskCreate(vTask2, "Task2", 1000, NULL, 1, &Task2);
xTaskCreate(vTask3, "Task3", 1000, NULL, 3, &Task3);
vTaskStartScheduler();
for (;;) { ; }
}