FreeRTOS 第十四章 任务管理

明确一下几个任务的状态:

就绪态:放入就绪列表可以被加载入CPU执行

运行态:正在占用CPU

阻塞态:不在就绪列表,在其它的列表中,也不一定在延时列表。会被移除就绪列表并且放到因什么而阻塞的对应的列表下。比如延时阻塞,等待信号量队列,等待读消息队列。

挂起态:当任务主动提出挂起,此时调度器对它不管用。需要调用专门的函数挂起和解除挂起。挂起也叫一种阻塞

调用vTaskSuspend()实现主动挂起,当然也可以挂起别的任务,只需要传入句柄,挂起自身参数是NULL.,。

在其函数中可以看到,其先把任务从就绪列表\阻塞列表移除,以及从等待事件列表移除,并且把这个任务加入挂起列表。这些都做完了之后判断提出挂起的任务的TCB是不是等于pxCurrentTCB这个变量,(大概率是相等的),如果是则判断一下是不是已经开启调度器,如果开启了调度则直接执行任务切换,如果没有开启调度,则需要更新一下pxCurrentTCB,可以看到更新pxCurrentTCB调用的是vTaskSwitchContext()函数,用于指定新的pxCurrentTCB。如前几章所述,在每次新创建任务的时候都会对比一下这个新创建任务的优先级和pxCurrentTCB的大小,如果新创建的更大,则赋值给这个pxCurrentTCB变量,确保开启调度的时候执行最高优先级任务。

vTaskSuspendAll()是挂起所有的任务,其就是把调度器锁定,不能实现上下文切换,也就不能执行中断函数,但是可以记录中断挂起,当退出挂起的时候,执行中断。调用多少次vTaskSuspendALL()就要调用多少次vTaskResumeALL()

来看恢复挂起任务操作vTaskResume()函数

其就是把任务从挂起列表移除加入就绪列表(从挂起态出来只能到就绪态),如果其优先级最高,则任务切换。

当然也有中断保护版本vTaskResumeFromISR()

为什么需要专门定义一个函数在中断中使用?

因为在中断中不能执行切换函数,比如vTaskResume()在解除挂起任务后且任务优先级最高,那么可以在函数中触发优先级最低的PendSV中断,而在一个普通中断中,其优先级应该会比PendSV高,当其使用任务切换函数的时候,因PendSV不能抢占这个高优先级的中断,整个中断就会停在这里。所以就定义了这个vTaskResumeFromISR()函数,其主要功能就只有解除挂起,不切换任务,当返回为pdTRUE(解除挂起的优先级最高)时候才执行切换,调用portYIELD_FROM_ISR函数(在中断中使用的任务切换函数),可想而知,其应该只是挂起PendSV,退出中断的时候执行任务切换。应该大多数需要区分中断版本的都是出于此原因

vTaskDelete()函数

其就是把任务从就绪列表删除或者等待事件列表移除。因任务不能删除自己,则把它添加到一个叫做结束列表中,在空闲任务的时候把这个任务给删除,然后把记录当前任务的变量减一,删除自己还需要执行任务切换。

vTaskDelay()和vTaskDelaUntily()是相对延时和绝对延时函数。相对延时的实现之前已经讲了,就是加入一个普通的延时列表,到期后从延时列表删除加入就绪列表,如果有更高优先级任务,其不会马上得到执行,vTaskDelaUntily()绝对延时固定时间,注意其用法,相对延时只需要传入Tick,而绝对延时有两个参数,除了延时tick,以及当前的系统tick.

设计时候的注意:在中断中一定不能使用使中断阻塞的函数,比如挂起当前任务,因为挂起当前任务没有中断保护版本,其执行了就有可能任务切换,就会导致阻塞(具体一点,比如PendSV中断不能执行就会导致阻塞,就算执行了,在PendSV中断函数中是把任务栈的某些寄存器POP出来到寄存器,然后退出PendSV时候又进入这个调用挂起的中断,就乱套了,在Cortex-M3中,中断会返回到进入中断时候的状态,加入从中断中进入,返回就在中断,从任务中进入,返回就在认真中),而解除挂起有中断保护版本,在一个普通中断使用了解除挂起的中断版本并确定该解除挂起的任务优先级最高,当该中断退出后,马上执行挂起的PendSV中断,然后任务切换。

在普通任务中,其格式是一个死循环的写法,比如一个for循环,但是其不能一直死循环,必须有阻塞的原因,比如延时阻塞,等待消息阻塞,不然更低优先级的得不到执行。处理时间更短的任务,其优先级应该更高,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值