11,FreeRTOS延时函数
一、实验目标
创建三个动态任务,栈空间大小均为128字。startTask、Task1、Task2。startTask仅运行一次,负责task1、task2任务的创建,startTask任务的删除。Task1负责相对延时函数展示。Task2负责绝对演示函数展示。
注:本实验基于正点原子FreeRTOS教程的学习总结。
二、实验准备
1.FreeRTOS的Keil动态任务创建与删除程序
2.STM3F407开发板
3.宏定义开启
将INCLUDE_vTaskDelayUntil、INCLUDE_vTaskDelay置一 。
#define INCLUDE_vTaskDelayUntil 1 /* 任务绝对延时 */
#define INCLUDE_vTaskDelay 1 /* 任务延时 */
4.所需API函数介绍
相对延时函数vTaskDelay。任务运行到vTaskDelay()函数时会被挂起到阻塞列表,等待相对延时完成,在重新进入就绪列表中,延时时间从vTaskDelay()函数运行起计算。
输入值xTicksToDelay 为延时时间,单位为ms。
void vTaskDelay( const TickType_t xTicksToDelay );
绝对延时函数vTaskDelayUntil。任务运行到vTaskDelayUntil()函数时也会被挂起到阻塞列表,但延时时间从进入该任务起计算。
输入值pxPreviousWakeTime为任务进入时间,从滴答定时器获取。输入值xTimeIncrement 为延时时间,单位为ms。
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,const TickType_t xTimeIncrement );
三、代码编写
3.1修改Task1的任务函数内容
Task1实现相对延时函数。
void task1(void *pvParameters)
{while(1){LED0_TOGGLE();vTaskDelay(500);//相对延时}
}
3.2修改Task2的任务函数内容
Task2实现绝对延时函数。
void task2(void *pvParameters)
{TickType_t xLastWakeTime;xLastWakeTime = xTaskGetTickCount();//获取进入任务时间while(1){LED1_TOGGLE();vTaskDelayUntil(&xLastWakeTime,500);//绝对延时}
}
四、实验现象
实验现象如下所示。可以看到脉冲的时间为指定500ms翻转一次。