FreeRTOS——任务调度、任务状态

news2024/9/29 13:43:21

任务调度

        调度器就是使用相关的调度算法来决定当前需要执行哪个任务。

FreeRTOS一共支持三种任务调度方式:

抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。(数值大的任务优先级高)

时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。

协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务,FreeRTOS现在虽然还支持但是官方已经表示不再更新协程式调度。

 抢占式调度

运行条件:

创建三个任务:Task1、Task2、Task3,他们的优先级分别为1、2、3,在FreeRTOS中,数值越大优先级越高。

运行过程如下:

1)首先Task1在运行中,在这个时候Task2进入就绪态,在抢占式调度器的作用下,Task2会抢占Task1的运行;

2)Task运行过程中,Task3进入就绪态,在抢占调度器的作用下Task3会抢占Task2的运行;

3)Task3运行过程中,Task3阻塞了(系统延时或等待信号量等),此时就绪态中优先级最高的任务运行。

总结:

1、高优先级任务,优先执行。

2、高优先级任务不停止,低优先级任务无法执行。

3、被抢占的任务会进入就绪态。

时间片调度

同等优先级任务轮流地享有相同的CPU时间(可设置系统滴答定时器的周期)叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期

运行条件:

创建三个任务:Task1、Task2、Task3,他们的优先级相同,均为1

运行过程如下:

1)首先Task1运行完一个时间片后,切换至Task2运行

2)Task2运行一个时间片后,切换至Task3运行

3)Task3运行过程中,如果阻塞了(系统延时或等待信号量等),只运行了0.5个时间片,此时也会让出CPU资源,让给Task1运行,Task1运行一个时间片之后切换Task2运行一个时间片,然后再切换给Task3运行一个时间片,而不是1.5个时间片。

总结:

1、同等优先级任务,轮流执行;时间片流转

2、一个时间片大小,取决为滴答定时器中断周期

3、注意没有用完的时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行


任务状态

   FreeRTOS中任务共存在4种状态:

  • 运行态 

        正在执行的任务,该任务就处于运行态,注意在STM32中:同一时间仅一个任务处于运行态。

  • 就绪态

        如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。

  • 阻塞态

        如果一个任务因延时或等待外部事件(信号量、互斥量等)发生,那么这个任务就处于阻塞态。

  • 挂起态

        类似暂停,调用函数 vTaskSuspend()进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。

四种任务状态之间的转换图:

总结:

1、仅就绪态可转变成运行态

2、其他状态的任务想运行,必须先转变成就绪态

FreeRTOS中无非就四种状态,运行态,就绪态、阻塞态、挂起态

这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表

就绪列表

pxReadyTasksLists[x],其中x代表任务优先级数值

如果用硬件的方式构建就绪列表,x的取值范围是0~31,也就是可以存放32个任务到就绪列表中

新创建的任务是直接挂在就绪列表中的,在我们创建任务时,给任务赋优先级,此时就会把我们的任务放到就绪列表的对应位置。那我们的系统怎么知道就绪列表的哪个位置有任务呢?

  • 设置一个32位的变量,当某个位置1时,代表所对应的优先级就绪列表有任务存在。

阻塞列表

pxDelayedTaskList

挂起列表

xSuspendTaskList

假设创建3个任务分别是Task1、Task2、Task3,优先级分别是1、2、3

此时我们的任务分别放在就绪列表的pxReadyTasksLists[1]、pxReadyTasksLists[2]、pxReadyTasksLists[3]。

首先我们的Task3优先级最高,会从就绪列表中取出Task3优先执行使其转为运行态,当Task3进入阻塞态(系统延时或等待信号量)时,就会把Task3放入阻塞列表,执行就绪列表中任务优先级高的其他任务Task2,Task2进入运行态,如果将Task2用pxSuspendTaskList使其挂起,这时Task2进入挂起列表,这时运行就绪列表中的Task1,使其进入运行态,这时Task2要解挂要调用pxSuspendTaskList。

如果Task1、Task2、Task3的优先级均为1呢

相同优先级的任务会连接在同一个就绪列表上

运行过程:首先Task1运行一个时间片的时间,然后Task2运行一个时间片的时间、再Task3运行一个时间片的时间。

总结:

调度器总是在所有就绪列表的任务中,选择具有最高优先级的任务去执行

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

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

相关文章

word批量裁剪图片,并调整图片大小,不锁定纵横比

在word中有若干图片待处理,裁剪出指定内容,调整成指定大小。如下是待处理的图片: 这时,选择视图,选择宏,查看宏 选择创建宏 添加cut_picture代码如下,其中上、下、左、右裁剪的橡塑尺寸根据自己…

【2】图像视频的加载和显示

文章目录 【2】图像视频的加载和显示一、代码在哪写二、创建和显示窗口(一)导入OpenCV的包cv2(二)创建窗口(三)更改窗口大小 & 显示窗口(四)等待用户输入补充:ord()函…

24最新ComfyUI搭建使用教程

前言 ComfyUI 是一个基于节点流程式的stable diffusion AI 绘图工具WebUI, 通过将stable diffusion的流程拆分成节点,实现了更加精准的工作流定制和完善的可复现性。 ComfyUI因为内部生成流程做了优化,生成图片时的速度相较于WebUI有10%~25…

关于字节 c++

字节的介绍 字节是计算机中最小的存储单位,通常由8个二进制位组成,用来存储一个字符。在C中,字节也是基本数据类型之一,用关键字"byte"来表示。字节主要用于存储一些较小的数据,如整数、字符等。字节的大小…

音频转MP3格式困难?如何轻松实现wav转mp3?

格式多样化为我们带来了灵活性和创意的无限可能,但同时,不同格式间的转换也成为了不少用户面临的难题。尤其是当你手握珍贵的WAV音频文件,却希望它们能在更多设备上流畅播放或节省存储空间时,wav转mp3的需求便应运而生。WAV以其无…

网络安全中的 EDR 是什么:概述和功能

专业知识:EDR、XDR、NDR 和 MDR_xdr edr ndr-CSDN博客 端点检测和响应 (EDR) 是一种先进的安全系统,用于检测、调查和解决端点上的网络攻击。它可以检查事件、检查行为并将系统恢复到攻击前的状态。EDR 使用人工智能、机器学习和威胁情报来避免再次发生攻…

c语言实现:链表创建、插入、删除、翻转

#include <stdio.h> #include <stdlib.h>// 链表创建 typedef struct Node{int data;struct Node* next; } Node;// 创建一个节点 Node* createNode(int data){Node* newNode (Node* )malloc(sizeof(Node));newNode->data data;newNode->next NULL;return…

35岁java转大模型笔记,大模型智能体(LLM Agent)学习笔记

\1. 什么是大模型&#xff1f; 大模型对应的英文是Large Language Model&#xff08;LLM&#xff09;&#xff0c;即大语言模型&#xff0c;简称大模型。技术层面讲&#xff0c;大模型是一种基于深度学习技术的机器学习模型。 为什么叫大模型呢&#xff1f;它是相对于小模型而…

万界星空科技铜拉丝行业MES系统,实现智能化转型

一、铜拉丝行业生产管理的难点主要体现在以下几个方面&#xff1a; 1、标准严格&#xff1a;铜线产品对质量的要求极高&#xff0c;特别是在电气性能、导电性、耐腐蚀性等方面&#xff0c;任何微小的瑕疵都可能影响产品的使用效果和安全性。 2、过程监控&#xff1a;生产过程…

点赞10万+,1分钟教会你,用AI生成的宠物带娃视频

今天刷到了这样的宠物带娃视频&#xff0c;最近这种视频爆火&#xff0c;出现了很多爆款&#xff0c;今天就拆解一下&#xff0c;教大家学会这种视频用AI如何生成。 我们先看一下这类视频的数据&#xff0c;很多账号都在做&#xff0c;对于不了解AI的人来说&#xff0c;会觉得…

轻松构建便民平台小程序源码系统 带完整的安装代码包以及搭建部署教程

系统概述 轻松构建便民平台小程序源码系统是一款集成了多项实用功能的模块化小程序开发框架。它基于当前最流行的小程序开发技术栈&#xff0c;如微信小程序、支付宝小程序等&#xff0c;通过预制的组件和模块&#xff0c;极大地简化了开发流程&#xff0c;降低了技术门槛。无…

Google BigTable架构详解

文章目录 什么是BigTable?架构图一、整体架构二、数据存储与索引存储模型 三、数据拆分与存储四、元数据管理五、读写流程 其他内容概览负载平衡其他存储和数据库选项 什么是BigTable? Bigtable是Google开发的一个高性能、可扩展的分布式存储系统&#xff0c;用于管理大规模…

Error running Application.Command line is too long

问题解析 本质上就是执行启动类Application的时候&#xff0c;执行的指令太长了&#xff0c;所以运行失败。 解决方案 1.打开Edit Configuration。 2.点击Modify options 3.勾选 Shorten command line 4.选择classpath file。 最终解决问题。

深入理解包管理工具

目录 引入npm配置文件常见属性版本理解package-lock.jsonnpm install其他命令发布自己的包 yarncnpmnpxpnpm安装和使用硬链接和软链接非扁平node\_modules存储store 引入 随着前端技术的发展&#xff0c;项目依赖的第三方库和工具越来越多&#xff08;例如&#xff1a;React、V…

信用卡验证-卢恩算法

卢恩算法 什么是 Luhn 算法&#xff1f; Luhn算法&#xff0c;也称为“模10算法”&#xff0c;是一种用于确定用户提供的标识号是否准确的公式。它广泛应用于验证信用卡号码以及其他数字序列&#xff0c;例如政府的社会安全号码 (SSN)。如今&#xff0c;Luhn算法是电子支付系…

详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读&#xff1a; java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09;【Java项目】实战CRUD的功能整理&#xff08;持续更新&#xff09; 1. 基本知识 HandlerInter…

OJ在线评测系统 前端创建题目(增) 更新题目(改) 题目列表(查) 以及做题页面的开发 基于VUECLI脚手架画界面

目录 前端创建页面的开发一 创建一个路由 用acro design写 前端创建页面的开发二 题目管理页面 搜索 最終效果 题目更新页面的开发 携带参数的那种 修改路由 页码更新细节 我们先处理菜单项的权限控制和权限隐藏 在这里改 属性绑定一个函数 可以参考聚合搜索项目…

金属增材制造咋突破?纳米纹理粉末如何助力金属增材制造?

大家好&#xff0c;今天我们来了解一篇金属增材制造文章——《High absorptivity nanotextured powders for additive manufacturing》发表于《Science Advances》。金属增材制造在医疗、航空航天等领域&#xff0c;它潜力巨大&#xff0c;但目前可打印的金属材料有限&#xff…

word中的表格全部设置宽度100%

1、背景 我们用工具将数据库或其他的数据导出成word时&#xff0c;表格有的会大于100%&#xff0c;超过了边界。word没有提供全局修改的方法。如果我们想改成100%。 一种方式是通过宏&#xff0c;全局改。一种是手动改。 2、宏修改 如果表格多&#xff0c;可以通过这种方式。…