十四、阻塞延时的两个函数及进行任务设计时需要注意的内容

1、vTaskDelay()-------相对延时函数

vTaskDelay (N) :表示至少等待N个的tickinterrupt才能变为就绪态

若想使用 FreeRTOS 中的 vTaskDelay()函数必须在 FreeRTOSConfig.h 中把 INCLUDE_vTaskDelay 定义为 1 。

vTaskDelay()用于阻塞延时,调用该函数后,任务将进入阻塞状态,进入阻塞态的任务将让出 CPU 资源。

函数里面形参为单位为系统节拍周期。其延时时间是从调用其完毕之后才开始算起的。

vTaskDelay()并不适用与周期性执行任务的场合。

其它任务和中断活动, 也会影响到 vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),进而影响到任务的下一次执行的时间。

即当其延时时间到达后,若有高优先级的任务或中断正在执行,则被阻塞的任务并不会立马接触阻塞。

2、vTaskDelayUntil()------绝对延时函数

即任务从上一次运行开始到下一次运行开始的时间间隔是绝对的。
常用于较为精确的周期运行任务。

void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,   //指向一个变量,该变量保存任务最后一次解除阻塞的时刻,第一次使用时期必须初始化为当前的时间
					const TickType_t xTimeIncrement )          //周期循环时间,当时间等于(*pxPreviousWakeTime + xTimeIncrement)时,任务解除阻塞。

调用 vTaskDelayUntil()使任务进入阻塞态,然后就是循环这样子执行。即使任务在执行过程中发生中断,那么也不会影响这个任务的运行周期,仅仅是缩短了阻塞的时间而已,到了要唤醒的时间依旧会将任务唤醒。

vTaskDelayUntil (t0 ,dt) :等待到指定的绝对时刻,才能变为就绪态,即在 t0 时刻算起,每经过dt 时间后变为就绪态(周期性的)

要求:在下次唤醒任务之前,即要被唤醒的任务的主体代码必须被执行完,即任务的执行时间必须小于任务周期时间 xTimeIncrement。

3、任务设计需要注意的点

(1)中断服务函数

应精简短小,快进快出。

一般在中断服务程序中只做标记事件的发生,然后通知任务去执行相关的操作。

(2)任务

应确保任务为出现阻塞机制的循环体。

即保证任务在不活跃的时候,任务可以进入阻塞态以交出CPU的使用权。

(3)任务的执行时间

多任务时,注意每个任务的运行时间,从而来确定每个任务对应的优先级。
所以一般处理时间更短的任务优先级应设置更高一点。

(4)空闲任务

在FreeRTOS中,,当调用 vTaskStartScheduler()时,调度器会自动创建一个空闲任务,空闲任务是一个非常短小的循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值