十一、任务的状态、任务是如何被管理的及空闲任务的作用

1、任务的四种状态

(1)就绪态

就绪态:该任务在就绪列表中,就绪的任务已经具备执行的能力,只等待调度器进行调度,新创建的任务会初始化为就绪态。

(2)运行态

该状态表明任务正在执行,此时它占用处理器,FreeRTOS 调度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的一刻,它的任务状态就变成了运行态。

(3)阻塞态

在等待某些事件发生,包含任务被挂起、任务被延时、任务正在等待信号量、读写队列或者等待读写事件等。(事件可以分为两类:一是时间相关的事件,即使用阻塞延时函数;二是同步事件,即某个任务在等待某些信息,别的任务或者中断服务程序会给它发送信息,发送信息的方法有:任务通知、队列、事件组、信号量、互斥量等)

(4)挂起态

处于挂起态的任务对调度器而言是不可见的,让一个任务进入挂起状态的唯一办法就是调用vTaskSuspend() 函数。

2、任务状态的迁移

在这里插入图片描述
1)运行态→阻塞态:正在运行的任务发生阻塞(挂起、阻塞延时、读信号量等待)时,该任务会从就绪列表中删除,任务状态由运行态变成阻塞态,然后发生任务切换,运行就绪列表中当前最高优先级任务。
2)就绪态、阻塞态、运行态→挂起态:任务可以通过调用 vTaskSuspend() API 函数都可以将处于任何状态的任务挂起,被挂起的任务得不到CPU 的使用权,也不会参与调度,除非它从挂起态中解除。
3)挂起态→就绪态:把一个挂起状态的任务恢复的唯一途径就是调用 vTaskResume() 或 vTaskResumeFromISR() API 函数

3、任务状态的记录及管理

对于FreeRTOS来说,如何存放每个任务的状态的捏?又是如何对任务进行管理的?
FreeRTOS的关键是链表,当然任务的状态也是通过链表进行管理的了,

对于FreeRTOS来说几乎每个任务状态均有一个链表。
如刚创建成功的任务,会将其任务控制块挂载在就绪链表中。(就绪链表中,又因为任务优先级有5个,所以每个优先级均有一个就绪链表

4、所有任务优先级一样的基础上,最后面创建的任务会先运行

(1)例1

在这里插入图片描述

(2)例2

在这里插入图片描述

5、空闲任务的作用

删除任务后的内存清零工作是在空闲任务中进行的。

在空闲任务中会自动调用其钩子函数(即相当于中断的回调函数一样)下面是使用钩子函数的一些注意事项
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值