vTaskDelay (N) :表示至少等待N个的tickinterrupt才能变为就绪态
若想使用 FreeRTOS 中的 vTaskDelay()函数必须在 FreeRTOSConfig.h 中把 INCLUDE_vTaskDelay 定义为 1 。
vTaskDelay()用于阻塞延时,调用该函数后,任务将进入阻塞状态,进入阻塞态的任务将让出 CPU 资源。
函数里面形参为单位为系统节拍周期。其延时时间是从调用其完毕之后才开始算起的。
vTaskDelay()并不适用与周期性执行任务的场合。
其它任务和中断活动, 也会影响到 vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),进而影响到任务的下一次执行的时间。
即当其延时时间到达后,若有高优先级的任务或中断正在执行,则被阻塞的任务并不会立马接触阻塞。
即任务从上一次运行开始到下一次运行开始的时间间隔是绝对的。
常用于较为精确的周期运行任务。
void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, //指向一个变量,该变量保存任务最后一次解除阻塞的时刻,第一次使用时期必须初始化为当前的时间const TickType_t xTimeIncrement ) //周期循环时间,当时间等于(*pxPreviousWakeTime + xTimeIncrement)时,任务解除阻塞。
调用 vTaskDelayUntil()使任务进入阻塞态,然后就是循环这样子执行。即使任务在执行过程中发生中断,那么也不会影响这个任务的运行周期,仅仅是缩短了阻塞的时间而已,到了要唤醒的时间依旧会将任务唤醒。
vTaskDelayUntil (t0 ,dt) :等待到指定的绝对时刻,才能变为就绪态,即在 t0 时刻算起,每经过dt 时间后变为就绪态(周期性的)。
要求:在下次唤醒任务之前,即要被唤醒的任务的主体代码必须被执行完,即任务的执行时间必须小于任务周期时间 xTimeIncrement。
应精简短小,快进快出。
一般在中断服务程序中只做标记事件的发生,然后通知任务去执行相关的操作。
应确保任务为出现阻塞机制的循环体。
即保证任务在不活跃的时候,任务可以进入阻塞态以交出CPU的使用权。
多任务时,注意每个任务的运行时间,从而来确定每个任务对应的优先级。
所以一般处理时间更短的任务优先级应设置更高一点。
在FreeRTOS中,,当调用 vTaskStartScheduler()时,调度器会自动创建一个空闲任务,空闲任务是一个非常短小的循环。
上一篇:新消费周报 | 上海乐高乐园即将开园;小红书与复旦达成AI合作;大疆进入扫地机器人市场 新消费周报 | 上海乐高乐园即将开园;小红书与复旦达成AI合作;大疆进入扫地机器人市场
下一篇:文件包含漏洞全面详解