1. 延时函数介绍
函数 | 描述 |
---|---|
vTaskDelay() | 相对延时 |
xTaskDelayUntil() | 绝对延时 |
相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束。
绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按照一定频率运行的任务。
比如时序要求非常高的,那么可以调用绝对延时。
绝对延时示意图:
(1) 为任务主体,本身任务要运行的时间,也就是任务真正要做的工作。
(2) 是任务函数中调用 vTaskDelayUntil() 对任务进行延时
(3) 为其他任务在运行。(高优先级)
比如说一些高优先级的任务是会抢占当前任务的,那抢占的时候,高优先级的任务在执行的时候,那当前任务其实时间还是照样过得。
所以它这里包含了三部分,这三部分加起来就是它的绝对延时时间。
2. 延时函数演示实验
实验目的:学习 FreeRTOS 相对延时和绝对延时API 函数的使用,并了解其区别
实验设计:将设计三个任务:start_task、task1,task2
三个任务的功能如下:
start_task:用来创建 task1 和 task2 任务
task1:用于展示相对延时函数 vTaskDelay() 的使用
task2:用于展示绝对延时函数 vTaskDelayUntil() 的使用
为了直观显示两个延时函数的区别,将使用 LED0(PB1) 和 LED1(PB0) 的翻转波形来表示
2.1 宏置 1
INCLUDE_vTaskDelayUntil 置 1。
2.1 任务函数实现
/* 任务一,演示相对延时函数 */
void task1( void * pvParameters )
{
while(1)
{
LED0_TOGGLE(); /* PB1 */
delay_ms(20);
vTaskDelay(500); /* 相对延时函数 */
}
}
/* 任务二,演示绝对延时函数 */
void task2( void * pvParameters )
{
TickType_t xLastWakeTime; /* 任务上一次的唤醒时间 */
xLastWakeTime = xTaskGetTickCount(); /* 获取当前的系统节拍计数值 */
while(1)
{
LED1_TOGGLE(); /* PB0 */
delay_ms(20);
vTaskDelayUntil(&xLastWakeTime,500); /* 绝对延时函数 */
}
}