RTOS笔记--任务状态与调度

任务状态

        freertos中的任务分为四个状态:就绪状态(ready)、运行状态(running)、阻塞状态(blocked)、暂停状态(suspended)

完整的任务状态转换图:

在使用vTaskDelay函数后任务就会转换为阻塞态,阻塞态下需要等待某个时间或某个事件才可以进入准备态随时被调用。

任务在除了暂停状态以外的任何状态都可以通过调用vTaskSuspend函数使得任务进入暂停状态,任务在运行中自行调用,非运行态则可以通过别的运行中的任务调用来令其进入暂停态。在暂停状态下可以调用vTaskResume函数恢复

任务管理与调度

关于优先级

        A.高优先级的任务未运行结束低优先级任务无法运行

        B.一旦高优先级的任务就绪就立刻运行

        C.同优先级的任务轮流运行

在代码中通过链表的方式进行任务管理,在代码宏定义中:

pxReadyTaskLists数组中存放56个链表,而本程序中的最高优先级为56,而这其中每一个链表放置的就是同优先级处于就绪态或运行态的任务TCB结构体

在创建任务的同时还会创建一个pxCurrentTCB指针指向最高优先级的任务,假设有ABC三个同优先级任务按顺序创建,A创建时指向A,B创建时指向B,C创建时指向C,在开启任务调度器后就会从指针处开始运行,因此同优先级最后一个创建的任务最先运行 

在FREERTOS中定义一个1000hz的时钟频率作为tick中断依据,在运行1ms后产生tick中断,中断中设置cnt++作为时钟基准并发起调度,调度的过程就是从上到下遍历pxReadyTaskLists数组中的56个链表,找到第一个非空的链表,使得pxCurrentTCB指针指向下一个任务,每次tick中断就会触发一次调度

高优先级任务可以无需tick调度直接在低优先级任务运行过程中进行抢占,例如,有AB两个任务,B任务优先级高于A任务,那么如果A任务在运行过程中B任务被置于就绪态则B任务会直接抢占开始运行,无需等待tick中断调度,然后在高优先级任务运行中使用DELAY函数则会将其从pxReadyTaskLists中的链表中取出放入xDelayedTaskList1进入阻塞态,并寻找立即下一个运行的任务,在低优先级的任务被抢占时会记录一个index指针指向被抢占的任务,此时就调用此任务。

存放在xDelayedTaskList1链表中的任务的TCB结构体中都会保存有需要等待的时间,而在tick中断时还会判断一下xDelayedTaskList1中的任务是否可恢复,如果可恢复则将其放入pxReadyTaskLists中的链表里,然后再发起调度。

在对任务调用vTaskSuspend函数后将其放入xSuspendedTaskList链表中,在暂停态下无法通过tick中断的判断重新进入就绪态,只能通过调用vTaskResume函数使其回归就绪态

调度总结:

        调度本质上就是链表管理,任务在不同状态下存入不同链表

        rtos中设置tick中断,而tick中断时进行的操作为:

                a.设置cnt++

                b.判断一下xDelayedTaskList1中的任务是否可恢复,如果可恢复则将其放入       pxReadyTaskLists中的链表里

                c.发起调度

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

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

相关文章

24V转3V的高效解决方案-AH8610.sot23-6

24V转3V的高效解决方案-AH8610.sot23-6 ### 引言 随着电子设备向小型化、高性能和高效率发展,对电源管理芯片的要求也越来越高。AH8610.sot23-6是一款专为小型化电源转换设计的同步降压开关芯片,它能够将24V的输入电压转换为3V输出,适用于US…

风管静压箱的作用及选型

1.压力的种类 动压—由风速而产生的压力;空调厂家设计时均已经考虑,无需计算。静压—垂直作用于风管壁面的压力,用于克服风管阻力;所以,对于风管机组有零静压和带静压之分,零静压指静压为0Pa,不…

[大师C语言(第二十篇)]C语言跨平台编程技术详解

引言 C语言作为一门历史悠久的编程语言,在性能、可移植性等方面具有显著优势。然而,随着软件工程的不断发展,C语言在安全性、代码可维护性等方面面临挑战。特别是在跨平台编程方面,如何确保代码在不同平台上的兼容性和一致性&…

thinkpad T440p ubuntu-slam软件安装记录

安装问题 1.ubuntu20.04安装后提示"x86/cpu:VMX(outside TXT) disabled by BIOS" 这是虚拟化被禁止了,到BIOS里去把Virtualization选项打开即可。 2.ACPI Error:Needed type[Reference],found [Integer] 等错误 link这篇博客中提到该问题,…

数学建模笔记

数学建模 定义角度 数学模型是针对参照某种事物系统的特征或数量依存关系,采用数学语言,概括地或近似地表述出的一种数学结构,这种数学结构是借助于数学符号刻画出来的某种系统的纯关系结构。从广义理解,数学模型包括数学中的各…

spring-boot 2.7.18整合sharding-jdbc-spring-boot-starter 4.1.1

sharding-jdbc 基本概念 逻辑表 水平拆分的数据表的总称。例:订单数据表根据主键尾数拆分为10张表,分别是 t_order_0 、 t_order_1 到 t_order_9 ,他们的逻辑表名为 t_order 。 真实表 在分片的数据库中真实存在的物理表。即上个示例中的…

数据库开发-Mysql03

目录 1. 多表查询 1.1 概述 1.1.1 数据准备 1.1.2 介绍 1.1.3 分类 1.2 内连接 1.3 外连接 1.4 子查询 1.4.1 介绍 1.4.2 标量子查询 1.4.3 列子查询 1.4.4 行子查询 1.4.5 表子查询 1.5 案例 2. 事务 2.1 介绍 2.2 操作 2.3 四大特性 3. 索引 3.1 介绍 3…

Android基础-flutter

Flutter的功能和作用 一、引言 Flutter,作为Google开源的移动UI框架,自其诞生以来,便以其独特的魅力和强大的功能吸引了全球众多开发者的目光。Flutter不仅为开发者提供了构建高性能、高质量跨平台应用的能力,而且极大地简化了开…

实验室类管理平台LIMS系统的ui设计实例

实验室类管理平台LIMS系统的ui设计实例

leetcode64-Minimum Path Sum

题目 给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。 说明:每次只能向下或者向右移动一步。 示例 1: 输入:grid [[1,3,1],[1,5,1],[4,2,1]] 输出&#xf…

项目管理工具的选择

1、为什么要用到项目管理工具 一个项目在启动后,需要做需求管理、计划排期,工作分解,开发、测试、验收,假设我们用excel来处理的话,会出现以下情况 (1)需求跟踪,如果用在线excel文…

第九十七节 Java面向对象设计 - Java Object.Finalize方法

Java面向对象设计 - Java Object.Finalize方法 Java提供了一种在对象即将被销毁时执行资源释放的方法。 在Java中,我们创建对象,但是我们不能销毁对象。 JVM运行一个称为垃圾收集器的低优先级特殊任务来销毁不再引用的所有对象。 垃圾回收器给我们一个…

weak的底层原理

weak 引用在 iOS 中通过维护一个全局的弱引用表来实现。当弱引用的对象被释放时,所有指向它的弱引用会被自动置为 nil,从而防止悬挂指针。 弱引用表(Weak Table)的键和值 理解弱引用表的键和值对于理解 weak 引用的底层机制非常重…

【加密与解密】【02】加密算法类型

加密算法类别 单向加密算法(MD5,SHA,校验数据完整性) 对称加密算法(DES,数据存储加密) 非对称加密算法(RSA算法,数据传输加密) 非对称加密和对称加密对比…

高通Android 12/13添加/移除不被清理后台应用

/*** 添加不被清理的后台应用** param packageName*/public void addBackgroundAliveApp(String packageName) {List<String> list getBackgroundAliveAppList();if (list ! null && packageName ! null && packageName.length() > 0) {if (!list.co…

牛客ds题1002践踏

分析每个操作 操作一&#xff0c;加入一条线段[l,r],感觉可以直接懒标记&#xff0c;[l,r] tag1&#xff0c;也可以差分操作 操作二&#xff0c;删除一条线段[l,r],[l,r]tag-1 操作三&#xff0c;xkty,问y可以在几条线段内&#xff0c;t取整数&#xff0c;一开始想暴力,r<…

容器运行nslookup提示bash: nslookup: command not found【笔记】

在容器中提示bash: nslookup: command not found&#xff0c;表示容器中没有安装nslookup命令。 可以通过以下命令安装nslookup&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y dnsutils对于基于CentOS/R…

AI网络爬虫:用GraphQL查询爬取动态网页数据

任务&#xff1a;爬取网站www.skillshare.com搜索结果页面数据&#xff1a; 查看网站的请求信息&#xff1a; 请求网址: https://www.skillshare.com/api/graphql 请求方法: POST 状态代码: 200 OK 远程地址: 127.0.0.1:10809 引荐来源网址政策: strict-origin-when-…

一篇文章讲透数据结构之树and二叉树

一.树 1.1树的定义 树是一种非线性的数据结构&#xff0c;它是有n个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 在树中有一个特殊的结点&#xff0c;称为根结点&#xff0c;根结点…

【玩转google云】在 Google Cloud 和 AWS 之间创建高可用性 VPN 连接(一)

目录 一、目标 二、架构:实现高可用性 VPN 连接 1、架构图 2、实现 99.99% 的服务可用性 SLA