FreeRTOS 时间管理

本文介绍了FreeRTOS中的相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()的区别,通过实例演示了如何在任务中使用它们控制LED翻转,以展示两种延时方式的实际效果。
摘要由CSDN通过智能技术生成

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);	/* 绝对延时函数 */
    }
}

3. 总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值