深入理解FreeRTOS_学习笔记(3.任务调度的原理)

**

文章大部分内容摘抄至B站的韦东山老师的深入了解FreeRTOS操作系统教程,若有不理解的地方,可点击链接学习韦老师的视频。

**

**

上一章已经了解了任务结构体,这章学习的是任务调度原理。如果有错误的地方,请批评指正,不胜感激!!

**


前言

任务我们已经知道是什么了,如果还不了解任务内部的机制,就先看一下第二章的任务的本质。上一章在介绍任务结构体时发现了里面有两个链表,在本章就能很好的解释操作系统为什么会提供这两个链表了。


一、任务优先级

我们都知道每个任务可以设定不同的优先级,优先级高的任务可以优先执行,获得CPU使用权。如果高优先级的任务不放弃CPU,那么低优先级的任务就永远无法执行。并且要知道FreeRTOS是抢占式的调度机制,低优先级的任务在运行途中高优先级任务就绪了,那么高优先级的任务也能抢占低优先级的任务。
注意:操作系统如果优先级相同的话,采用时间片轮转算法,即每个任务运行相同的时间。

二、任务的状态

任务共有几个状态:分别是运行态,就绪态,阻塞态,挂起态
阻塞态和挂起态的区别:阻塞态是在等待某件事,某个事件,可以通过事件等唤醒。挂起态是任务休息了,需要人为的唤醒。

三、任务调度原理概述

知道上面的内容后,我们就得学习操作系统是怎么去管理任务的了。在FreeRTOS操作系统中,是通过链表来实现的。调度器需要先找出最高优先级的就绪态任务去运行,如果大家的优先级任务是一样的,大家就轮流执行,链表前面的先执行,运行一个时钟周期后调度器便将任务插入链表尾部,从而实现轮转执行。

四、任务调度原理详解

在这里插入图片描述
可以看出任务创建内部在创建成功后,会将任务添加到就绪链表中。
在这里插入图片描述
在继续查看原码,可以发现是根据优先级对不同的任务插入不同的优先级链表中,可以查看pxReadyTaskLists内部结构可以看到,总共有五个值,分别对应五个优先级,每一个优先级都会插入对应的链表中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在FreeRTOS.Config中我们还可以看到,还有阻塞链表,挂起链表等,不过CPU主要是对就绪链表进行查看,阻塞链表、挂起链表中的操作由调度器根据情景将任务从其中的任务分别插入和删除到就绪链表中,然后CPU对就绪链表从高优先级的依次寻找,然后执行。其调度过程如下图:
在这里插入图片描述
在这里插入图片描述
上面的图是创建了三个任务,任务3的优先级为2,所以将任务3存储在就绪链表3中,然后任务1和任务2优先级相同,都存储在就绪链表0中,在任务3运行结束或者是任务3延时之后,就会运行任务1,运行一个tick后,如果任务1还未运行完成,那么CPU就会保留任务现场,在任务2运行一个tick后,CPU会恢复现场,并且运行任务1。运行结束后都会由调度器尾插到链表后。调度器又是什么呢??他是怎么实现任务调度的呢??

四、任务调度器

其实调度任务的是tick中断!!每一个tick计数完成后,便会发生一次tick中断函数。也可以说是定时器中断,在中断函数中:它执行的操作是:取出下一个任务,进行切换,如果运行完成,就恢复新的task,如果没执行完成,就会保存当前任务的现场。
在这里插入图片描述

五、空闲任务

我们都知道操作系统开启之后就要运行任务或者任务切换,那么如果我们创建的任务都delay了,都在阻塞的状态中,那么CPU会干嘛呢,会运行什么任务呢?这个时候就要介绍一下空闲任务了,空闲任务其实就和名字一样,是操作系统空闲下来才会执行的,它的优先级一般是最低的,这样可以保证其他的任务可以随时抢占它来执行。它在开启调度器这个函数中被创建。

在这里插入图片描述

总结

这章就了解了操作系统内部其实有很多的链表结构,根据每一个tick中断后,都会去就绪链表中查找高优先级的任务,如果任务中调用了阻塞、休眠等函数,任务会从就绪链表中删除,插入到相对应的阻塞和休眠链表中,从而实现任务的切换。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值