十四、阻塞延时的两个函数及进行任务设计时需要注意的内容
创始人
2025-05-31 19:11:52

文章目录

  • 1、vTaskDelay()-------相对延时函数
  • 2、vTaskDelayUntil()------绝对延时函数
  • 3、任务设计需要注意的点
    • (1)中断服务函数
    • (2)任务
    • (3)任务的执行时间
    • (4)空闲任务

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()时,调度器会自动创建一个空闲任务,空闲任务是一个非常短小的循环。

相关内容

热门资讯

双子座流星雨划过各地夜空 12月13日至14日,年度“终极浪漫天象”,一年一度的双子座流星雨来临。双子座流星雨是北半球三大流星...
三案合并查处罚没6528万 永... 中经记者 孙汝祥 夏欣 北京报道12月13日,江苏证监局公布对永拓会计师事务所(以下简称“永拓所”)...
约车“张冠李戴” 司机收入缩水... 据央视新闻消息,数据显示,2024年我国网络货运市场规模已突破930亿元,发展势头迅猛。然而,快速增...
四年来总结 我们来总结一下这四年以来行情的变化。前三年有3000点之下有很好的机会,只不过这个时候大多数人倾向于...