FreeRTOS的任务非运行态

本文深入探讨FreeRTOS任务调度器的工作原理,介绍任务的非运行态,包括ready、阻塞态和挂起状态,解释如何通过这些状态配合任务优先级实现多任务的有效执行。并详细说明了vTaskDelay和vTaskDelayUntil两个函数的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当FreeRTOS启动任务调度器以后,任务调度器会在心跳中断函数中确定下一个要运行的任务,如果任务调度器仅仅依靠任务优先级来判断该运行哪个任务,这样会造成低优先级的任务根本没法运行,因为FreeRTOS的任务都是循环执行的,这样就失去了优先级的意义。为了统筹安排任务的执行,FreeRTOS增加了任务的非运行态:

  ready:当内核正在执行最高优先级的任务的时候,其他已经做好准备可以随时运行的任务的状态;

  阻塞态:就是任务在等待某个同步事件的发生(比如某个信号量,互斥量等等),或者任务在等待定时器的触发,只有在驱动事件发生或者定时器触发的情况下,这个任务才有资格转换成ready状态,如果没有转换成ready状态,即使优先级再高,调度器也不会调用这个任务的,如果阻塞态等待的同步事件在规定的事件内没有发生,那么就触发定时器;

  挂起状态:任务调度器根本就不会考虑挂起状态的任务,更不用说执行挂起状态的任务了;

 

阻塞态应用很好的一个例子就是vTaskDelay(time_period/portTICK_RATE_MS); 这个函数会一直处在阻塞态,可以取代for循环的轮询延时函数,这个for循环延时会增加CPU的负担又不干任何有意义的事情,所以用vTaskDelay()来做延时函数更合适,在vTaskDelay()中,参数表达式的分子部分time_period是一心跳单位为计数单位的时间值,分母部分是每毫秒对应的心跳数值,这样正好可以得到延时的毫秒值;

还有一个阻塞态延时函数vTaskDelayUnil(pxPreciousWakeTime, xTimeIncrement),这个函数相比vTaskDelay()来讲更精确,该函数可以保证固定的执行频率,第一参数的意思是被唤醒的时间,第二个参数的意思是从阻塞态切入ready状态的时间;

正是有了费运行态(阻塞态和挂起状态)的存在,再配合任务优先级,才让RTOS真正的可以执行多任务;

 

转载于:https://www.cnblogs.com/braveheart007/p/10415442.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值