首页 > 代码库 > FreeRtos——多任务

FreeRtos——多任务

多任务和单任务几乎没有差别。只用多创建一个或多个任务,其他地方和单任务时相同。

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 函数原型

技术分享

 

 

FreeRtos——多任务