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

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

使用链表来管理任务

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

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

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

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

xTaskCreate
    prvAddNewTaskToReadyList
    	listINSERT_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的底层掌握更进一步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Python从入门到进阶】56、Mysql防止SQL注入及ORM库简化操作

接上篇《55、使用Python轻松操作Mysql数据库》 上一篇我们讲解了Mysql的基本链接和增删改查&#xff0c;本篇我们来介绍链接Mysql时参数化查询与防止SQL注入以及使用ORM&#xff08;对象关系映射&#xff09;库简化操作的内容。 一、参数化查询与防止SQL注入 在数据库操作中&…

Anaconda 出现HTTP000报错的解决方法

在使用Anaconda 安装python的时候遇到这个错误 chenchen-Standard-PC-i440FX-PIIX-1996:~$ conda create -n sdwebui python3.10.9Solving environment: failedCondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/r/noarch/repodata.jso…

如何跨渠道分析销售数据 - 6年软件销售经验小结

如何跨渠道分析销售数据 - 6年软件销售经验小结&#xff08;1&#xff09; 【前言】 在我过去6年销售工作生涯中&#xff0c;从第一年成为公司销冠后&#xff0c;我当时的确自满的一段时间&#xff0c;认为自己很了不起。但是第一年的销售业绩并没有拿到提成&#xff0c;最终…

架构设计之安全性属性深度剖析:从理论到实践的完美融合

文章目录 引言一、安全性属性的理论探讨1.1 定义说明1.2 安全原则1.3 安全模型1.4 安全机制 二、安全性属性的实践应用2.1 安全风险评估2.2 架构设计中的安全考虑2.3 技术手段和工具2.4 团队协作与沟通2.5 安全政策和流程2.6 合规性和标准2.7 持续监控和改进 三、理论与实践的融…

c++中 unordered_map 与 unordered_set 用法指南

unordered_map 与 unordered_set 区别与联系 unordered_map 和 unordered_set 都是 C 标准模板库&#xff08;STL&#xff09;中的容器&#xff0c;它们使用哈希表作为底层数据结构&#xff0c;提供了快速的查找、插入和删除操作。下面是它们之间的联系与区别&#xff1a; 联系…

大数据分析统计

大数据分析统计 from datetime import datetimeimport pandas as pd import matplotlib.pyplot as pltpm25files [PM2.5_2021.csv, PM2.5_2022.csv, PM2.5_2023.csv] pm10files [PM10_2021.csv, PM10_2022.csv, PM10_2023.csv]def read_csv_file(files):# 每个文件都有表头…

ch5链路层和局域网

回顾TCP/IP参考模型&#xff0c;明确链路层和物理层在整个模型中的地位&#xff0c;简要提出链路层要解决的问题是单段链路的数据传输&#xff0c;物理层解决的是数字信号与电气信号之间的相互转换。 链路层概述 节点&#xff1a;主机和路由器(包括网桥和交换机) 链路&#xf…

移动端路由切换解决方案 —— 虚拟任务栈让你的 H5 像APP一样丝滑

目录 01: 前言 02: 通用组件&#xff1a;trigger-menu 和 trigger-menu-item 构建方案分析 03: 通用组件&#xff1a;构建 trigger-menu 和 trigger-menu-item 04: 前台业务下 H5 的应用场景 05: 通用组件&#xff1a;transition-router-view 构建方案分析 与 虚拟任务栈…

04Linux文件系统

课程目标 1、了解Linux操作系统的硬盘分区信息 2、了解Linux操作系统重各目录的作用 3、了解Linux的启动级别以及关机和重启命令 课程实验 在xshell中使用df -h &#xff0c;df -T&#xff0c;du -sh,fdisk -|,cd ,pwd 使用top &#xff0c;free&#xff0c;cat/proc/xxx…

ChaosBlade混沌测试实践

ChaosBlade: 一个简单易用且功能强大的混沌实验实施工具 官方仓库&#xff1a;https://github.com/chaosblade-io/chaosblade 1. 项目介绍 ChaosBlade 是阿里巴巴开源的一款遵循混沌工程原理和混沌实验模型的实验注入工具&#xff0c;帮助企业提升分布式系统的容错能力&…

面向对象技术

一、基本概念 二、设计原则 三、设计模式的概念与分类 四、创建型模式 五、结构型模式 六、行为型模式 七、Java程序设计

43-5 waf绕过 - 安全狗简介及安装

一、安全狗安装 安装安全狗需要开启 Apache 系统服务。如果 Apache 系统服务未开启,安装过程中可能会出现无法填入服务名称的问题,导致无法继续安装。为避免此问题,可以先在虚拟机中安装 PHPStudy。 安装PHPStudy 下载、安装phpstudy并启动(安装过程可以一路下一步,也…

使用Streamlit和MistralAI创建AI聊天机器人应用

大家好&#xff0c;创建交互式和用户友好型的应用程序通常需要复杂的框架和耗时的开发过程。Streamlit是一个Python库&#xff0c;它简化了以数据为重点的网络应用程序的创建过程&#xff0c;使开发人员和数据科学家能够快速将他们的想法转化为交互式仪表盘和原型。本文将介绍使…

【Java】数据加密

目录 数据加密介绍使用场景密码学历史古代密码学凯撒密码例子特点 维吉尼亚密码原理例子特点 现代密码学介绍 现代密码学的加密算法分类哈希算法优点缺点代码示例【封装写法】 对称加密算法对称加密算法的加密过程解密过程对称加密算法的优点&#xff1a;对称加密算法的缺点&am…

2024 cicsn Ezheap

文章目录 检查 libc2.35利用adddeleeditshow 思路exp结果 检查 libc2.35 利用 add 0x80个chunk&#xff0c;遍历选一个没有被用的&#xff0c;输入的size<0x501,然后malloc后会清零安装输入的size&#xff0c;然后输入内容&#xff0c;长度也是输入的size dele 指定索引…

你认识nginx吗,nginx是做什么的,nginx可以做什么 --1)nginx介绍

一.Nginx 介绍 Nginx&#xff08;发音同engine x&#xff09;是一个异步框架的 Web 服务器&#xff0c;也可以用作反向代理&#xff0c;负载平衡器 和 HTTP 缓存。该软件由 Igor Sysoev 创建&#xff0c;并于2004年首次公开发布。同名公司成立于2011年&#xff0c;以提供支持。…

JavaWeb_SpringBootWeb基础

先通过一个小练习简单了解以下SpringBootWeb。 小练习&#xff1a; 需求&#xff1a;使用SpringBoot开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 步骤&#xff1a; 1.创建SpringBoot项目&#xff0c;勾选We…

HTML 转义字符(escape characters)及其对应的符号(symbols)

以下是常见的 HTML 转义字符及其对应的符号&#xff0c;这些可以用于在 HTML 或 JSX 中避免解析错误和特殊字符的冲突&#xff1a; 空格 ( ): 或 引号: 单引号&#xff08;&#xff09;&#xff1a;&apos;、&lsquo;、、&rsquo;双引号&#xff08;"&#x…

互联网简史-分久必合,合久必分

六一儿童节&#xff0c;给孩子们讲讲互联网的历史。 任何当代技术都是古老技术的重组&#xff0c;这是真的。我从电话网络开始&#xff0c;两幅图完事。电波可以承载语音作为最开始&#xff0c;后面的事自然而然&#xff1a; 说实话&#xff0c;网络这种事&#xff0c;它的 …

面试必问:MySQL死锁是什么,如何解决?(史上最全)

MySQL死锁接触少&#xff0c;但面试又经常被问到怎么办&#xff1f; 最近有小伙伴在面试的时候&#xff0c;被问了MySQL死锁&#xff0c;如何解决&#xff1f; 虽然也回答出来了&#xff0c;但是不够全面体系化&#xff0c; 所以&#xff0c;小北给大家做一下系统化、体系化的…