FreeRTOS任务调度机制(源码讲解)

 任务的调度机制(核心是链表)!!!

使用链表来管理任务

在我前面写的FreeRTOS任务(深入到源码进行分析),我创建了三个任务,他们的优先级都是一样的,所以他们在FreeRTOS中是轮流执行的,实际上,根据不同的需求,会创建出不同优先级的任务,有些任务的优先级高,就会优先执行,只要优先级任务处于就绪状态之下,低优先级的任务就永远无法执行。有很多任务都想运行,优先级各不相同,怎么管理它们?

 在task.c文件下面,创建了很多的链表,如图:

每个优先级,都有一个就绪链表:pxReadyTasksLists[优先级],

任务被创建时,要使用prvAddNewTaskToReadyList()来把它放入对应的就绪链表,调用过程为:

xTaskCreateprvAddNewTaskToReadyListlistINSERT_END( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xStateListItem ) );

 使用链表来理解调度机制

第1个任务是谁?

最高优先级的ready list里最后一个创建的任务:

这里可以解释,为什么在任务进行调度之前,相等优先级以及该优先级是最高优先级的情况下,后创建的任务会先运行,因为pxCurrentTCB->uxPriority <= pxNewTCB->uxPriority,等于状态下pxCurrentTCB也会指向新创建的任务(后创建的任务)。

 抢占

最高优先级的ready list里的第1个任务永远可以即刻执行:

 使用链表和Tick来理解时间片轮转

FreeRTOS的任务轮转时:每个任务运行一个Tick。一个Tick有多大,我们可以在FreeRTOSConfig.h中找到。

在FreeRTOS中,用于配置时钟节拍频率和任务调度行为的宏通常包含在FreeRTOSConfig.h文件中。以下是一些常见的宏定义,用于配置FreeRTOS的行为:

1. configTICK_RATE_HZ:用于设置时钟节拍的频率,即每秒钟的时钟节拍数。
2. configUSE_PREEMPTION:用于启用或禁用抢占式调度。
3. configUSE_TIME_SLICING:用于启用或禁用时间片轮转调度。
4. configMAX_PRIORITIES:用于设置系统支持的最大任务优先级数量。

这些宏定义可以根据你的需求进行配置,以定制化FreeRTOS的行为和任务调度机制。你可以在FreeRTOSConfig.h文件中找到这些宏定义,并根据需要进行修改。

 任务状态的切换(链表+Tick)

任务状态切换图 :

Ready:就绪状态

Blocked:阻塞状态

Suspended:挂起状态 

在FreeRTOS中,任务的状态可以分为几种,包括就绪状态(Ready)、阻塞状态(Blocked)和挂起状态(Suspended)。这些状态对应了不同的任务链表,这些链表在FreeRTOS内核中用于管理任务的调度和状态转换。

1. Ready状态(就绪状态)的任务存储在就绪任务列表(Ready List)中。这个列表包含了所有已经准备好运行,但还未被调度执行的任务。

2. Blocked状态(阻塞状态)的任务存储在阻塞任务列表(Blocked List)中。这个列表包含了由于某种原因而无法立即执行的任务,比如等待某个事件发生或者等待某个资源的释放。

3. Suspended状态(挂起状态)的任务通常不会存储在特定的链表中,因为挂起状态的任务已经被暂时停止,不参与调度。它们的状态信息通常会以其他方式进行管理,比如在任务控制块中进行标记。

通过这些链表,FreeRTOS可以有效地管理任务的状态转换和调度,确保任务按照预期的方式执行。

总结:

链表在任务调度中起着至关重要的作用,对任务的管理和调度都有着重要的影响。以下是链表在任务调度中的作用和影响的总结:

1. 任务状态管理:链表用于存储不同状态的任务,如就绪状态、阻塞状态等。通过将任务按照状态存储在不同的链表中,操作系统可以高效地管理和调度任务。

2. 调度算法实现:操作系统根据不同的调度算法(如优先级调度、时间片轮转调度等)从任务链表中选择下一个要执行的任务。链表提供了数据结构来组织和管理这些任务,以便调度器能够快速找到合适的任务进行调度。

3. 任务状态转换:任务在不同状态之间转换时,需要移动到不同的链表中。例如,一个任务从就绪状态变为阻塞状态时,需要从就绪任务列表中移除并加入到阻塞任务列表中。链表提供了数据结构来支持这种状态转换操作。

4. 系统性能影响:链表的设计和实现会影响任务调度的效率和系统性能。良好设计的链表数据结构可以提高调度器的效率,减少任务切换的开销,并促进系统的稳定运行。

综上所述,链表在任务调度中扮演着关键的角色,通过有效地管理任务的状态和调度顺序,帮助操作系统实现高效的任务调度和管理。知道了链表和任务调度的关系,在后续的学习中将会如虎添翼,让你对FreeRTOS的底层掌握更进一步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/20613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

19.1 简易抽奖

准备一个数组&#xff0c;里面添加10个奖品数据&#xff0c;让奖品数据快速的在盒子中随机显示&#xff0c;通过按钮控制盒子里面的内容停止。 效果图&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8">&…

解释Python中的PEP 8是什么 为什么它很重要

PEP 8 是 Python 的一个编码规范&#xff0c;也称为 Python 增强提案 8。它提供了一系列关于如何编写清晰、一致的 Python 代码的指导原则。这些原则涵盖了代码布局、命名约定、注释、文档字符串、编码建议、导入语句、异常、全局变量、嵌套等方面。 为什么PEP 8很重要&#x…

npm install pubsub-js报错的解决汇总

我在练习谷粒商城P83时&#xff0c;选择分类时触发向后端请求选择分类catId绑定的品牌数据&#xff0c;发现前端控制台报错&#xff1a; "PubSub is not definded",找不到pubsub。 因为缺少pubsub包&#xff0c;所以开始安装此包。 于是在网上一顿搜索猛如虎&…

xilinx ip自带XDC只读

检查生成的IP核再目录下显示的文件类型是不是.xcix 如果是的话&#xff0c;重新生成为.xci 再二次编辑即可 或者 将框柱的部分不选择&#xff0c;从新生成

MongoDB CRUD操作:批量写操作

MongoDB CRUD操作&#xff1a;批量写操作 文章目录 MongoDB CRUD操作&#xff1a;批量写操作关于批量操作的顺序bulkWrite()支持的方法举例向分片集合批量插入的策略预分割集合无序写入 mongos避免单调节流 MongoDB提供了批量执行写入操作的能力&#xff0c;但批量写入操作只影…

《计算机工程与应用》最新投稿经验2024年5月

研二下第一次投稿&#xff0c;深度学习长时间序列预测方向&#xff0c;选择了《计算机工程与应用》期刊&#xff0c;是CSCD扩展刊北大核心&#xff0c;且在24年被EI收录等等。4.10交稿到最后5.31收到录用通知&#xff0c;历时不到2个月&#xff0c;总的来说编辑部效率确实高。 …

LLM背后的基础模型 1

写在最前面的话 任何开源技术是最有生命力的&#xff0c;也是最具分享精神的。一直觉得大模型领域需要有一个系列能够从零开始系统性的讲述领域知识&#xff0c;给与这个领域的从业人员或者对其有兴趣的门外汉及时的帮助。国外承担“布道者”的公司众多&#xff0c;而数砖公司…

云技术最全详解

目录 云技术 1.定义 2.特点 2.类型 2.1IaaS&#xff08;基础设置即服务&#xff09; 2.2PaaS&#xff08;平台即服务&#xff09; 2.3SaaS&#xff08;软件即服务&#xff09; 3.云技术模型 3.1公有云 3.2私有云 3.3混合云 云技术 1.定义 云技术是一种云计算和存储…

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR

如何让 LightRoom 每次导入照片后不自动弹出 SD 卡 LR 在导入窗口左上角有个选项&#xff1a; 导入后弹出 把这个去掉就可以了

Rust 基本语法

变量 整数 无符号整数以u开头有符号整数以i开头对于Rust默认整数是i32对于整数溢出 开发模式中编译会检测溢出&#xff0c;如果溢出会导致程序panic发布模式中编译不会检查可能会导致的溢出&#xff0c;如果运行时发生溢出&#xff0c;会执行环绕操作保证数值在范围内且程序不…

Spark大数据 掌握RDD的创建

在Apache Spark中&#xff0c;弹性分布式数据集&#xff08;Resilient Distributed Dataset&#xff0c;简称RDD&#xff09;是一个核心的数据结构&#xff0c;用于表示不可变、可分区、可并行操作的元素集合。理解并掌握RDD的创建是使用Spark进行大数据处理的关键步骤之一。 …

Qt Creator(Qt 6.6)拷贝一行

Edit - Preference - Environment&#xff1a; 可看到&#xff0c;拷贝一行的快捷键是&#xff1a; ctrl Ins

数据结构-堆(带图)详解

前言 本篇博客我们来仔细说一下二叉树顺序存储的堆的结构&#xff0c;我们来看看堆到底如何实现&#xff0c;以及所谓的堆排序到底是什么 &#x1f493; 个人主页&#xff1a;普通young man-CSDN博客 ⏩ 文章专栏&#xff1a;数据结构_普通young man的博客-CSDN博客 若有问题 评…

程序员是牛马吗?

在今天的讨论中&#xff0c;一个引人深思的问题被提出&#xff1a;程序员是否只是现代社会的牛马&#xff1f;这个问题迅速引发了激烈的争论。许多程序员开始意识到&#xff0c;尽管他们辛勤工作&#xff0c;但最终可能仍无法摆脱被剥削的命运。因此&#xff0c;他们渴望改变&a…

MySQL(二)-基础操作

一、约束 有时候&#xff0c;数据库中数据是有约束的&#xff0c;比如 性别列&#xff0c;你不能填一些奇奇怪怪的数据~ 如果靠人为的来对数据进行检索约束的话&#xff0c;肯定是不行的&#xff0c;人肯定会犯错~因此就需要让计算机对插入的数据进行约束要求&#xff01; 约…

混合模型方差分析

文章目录 一、说明二、受试者“间”因素和受试者“内”因素的意思&#xff1f;三、混合模型方差分析回答 3 件事四、混合模型方差分析的假设 一、说明 在本文中&#xff0c;我将讨论一种称为混合模型方差分析的方差分析变体&#xff0c;也称为具有重复测量的 2 因素方差分析。…

音视频开发_SDL事件处理

今天我为大家介绍一下SDL的事件处理。这里所指的事件处理就是我们通常所说的&#xff0c;键盘事件&#xff0c;鼠标事件&#xff0c;窗口事件等。 SDL对这些事件都做了封装&#xff0c;提供了统一的API&#xff0c;下面我们就来详细的看一下。 SDL中的事件处理 要想了解 SDL…

VB.net进行CAD二次开发(四)

netload不能弹出对话框&#xff0c;参考文献2 参考文献1说明了自定义菜单的问题&#xff0c;用的是cad的系统命令 只要加载了dll&#xff0c;自定义的命令与cad的命令同等地位。 这时&#xff0c;可以将自定义菜单的系统命令替换为自定义命令。 <CommandMethod("Add…

STL-queue的使用及其模拟实现

在C标准库中&#xff0c;队列(queue)是一种容器适配器&#xff0c;它以先进先出的方式组织数据&#xff0c;其中从容器一端插入元素&#xff0c;另一端取出元素。 queue的使用 queue的构造函数 queue的成员函数 empty&#xff1a;检测队列是否为空size&#xff1a;返回队列中有…

代码随想录算法训练营 day23| ● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

文章目录 前言669. 修剪二叉搜索树思路方法一 递归法方法二 迭代法 108.将有序数组转换为二叉搜索树思路方法一 递归法方法二 迭代法 538.把二叉搜索树转换为累加树思路方法一方法二 总结 前言 迭代法都没看主要是669和538【538很简单】 669. 修剪二叉搜索树 思路 不用看教程…