多任务和单任务几乎没有差别。只用多创建一个或多个任务,其他地方和单任务时相同。
static void AppTaskCreate(void) { xTaskCreate(vTaskLed1, /* 任务函数名 */ "Task Led1", /* 任务名,字符串形式,方便调试 */ 512, /* 栈大小,单位为字,即4个字节 */ (void *)&task_led3, // task_led1-task_led3可以切换 /* 任务形参 */ 1, /* 优先级,数值越大,优先级越高 */ &xHandleTaskLED1); /* 任务句柄 */ xTaskCreate( vTaskBeep, "Task Beep", 512, NULL, 2, &xHandleTaskBeep); }
这里采用一个任务做LED灯闪烁,一个任务做蜂鸣器,可以看到两个任务展现出似乎同时运行的现象。
但是,其中有一个地方需要测试。
我们知道裸机中,优先级设置一样时,会看硬件编号,小的优先级高。
freertos中,优先级数值越大的,优先级越高,那么,要是设置成优先级相同,那是以什么方式运行的呢?这个等到下一章,讲串口调试时我们来验证。
vTaskDelayUntil() API 函数
vTaskDelayUntil()类似于 vTaskDelay()。和范例中演示的一样,函数 vTaskDelay()
的参数用来指定任务在调用 vTaskDelay()到切出阻塞态整个过程包含多少个心跳周期。
任务保持在阻塞态的时间量由 vTaskDelay()的入口参数指定,但任务离开阻塞态的时刻
实际上是相对于 vTaskDelay()被调用那一刻的。 vTaskDelayUntil()的参数就是用来指定
任务离开阻塞态进入就绪态那一刻的精确心跳计数值。 API 函数 vTaskDelayUntil()可以
用于实现一个固定执行周期的需求(当你需要让你的任务以固定频率周期性执行的时
候)。由于调用此函数的任务解除阻塞的时间是绝对时刻,比起相对于调用时刻的相对
时间更精确(即比调用 vTaskDelay()可以实现更精确的周期性)。
void vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeIncrement );
程序清单 13 vTaskDelayUntil() API 函数原型
时间: 2024-11-10 11:26:30