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,不…

数学建模笔记

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

数据库开发-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…

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

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

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

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

weak的底层原理

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

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

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

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

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

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

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

免费工具扫描 Linux 中已知威胁

首发公众号网络研究观,关注获取更多。 卡巴斯基为 Linux 平台发布了一款名为 KVRT 的新病毒清除工具,允许用户免费扫描他们的系统并清除恶意软件和其他已知威胁。 尽管人们普遍误以为 Linux 系统本质上是安全的,不会受到威胁,但不…

如何使用Vuforia AR进行增强现实技术的开发?

前言 今天是坚持写博客的第17天,很高兴自己可以一直坚持下来。我们今天来讲讲怎么使用Vuforia AR进行增强现实的开发。 我们需要在今天的开发中用到Vuforia AR和2018版的Unity3d 什么是Vuforia AR Vuforia AR是基于实时计算摄影机影像的位置及角度,并…

Kubernetes ingress

目录 一.ingress 1.ingress简介 2.实现外部应用能访问内部集群服务的方法 (1)NodePort: (2)LoadBalancer: (3)externalIPs: (4)ingress&am…

【会议征稿,ACM独立出版】第三届机器人、人工智能与信息工程国际学术会议(RAIIE 2024,7月05-07)

2024年第二届机器人、人工智能与信息工程国际学术会议(RAIIE 2024)将于2024年7月5-7日在新加坡举行。本次会议主要围绕“机器人”、“智能仿生”和“信息科学”的最新研究进展展开,会议汇聚了该领域内国际学者、专家、研究人员及相关从业人员…

274 基于matlab的随机粗糙表面对微气体轴承内气体压强分布的影响

基于matlab的随机粗糙表面对微气体轴承内气体压强分布的影响。采用差分法求解气体轴承的雷诺方程,通过尺寸参数、分形维数对粗糙度表面设置,滑流参数设置,实现气压分布可视化结果显示。程序已调通,可直接运行。 274 气体轴承 随机…

基于websocket与node搭建简易聊天室

一、前言 上一篇文章介绍了websocket的详细用法与工具类的封装,本篇就基于websocket搭建一个简易实时的聊天室。 在本篇开始之前也可以去回顾一下websocket详细用法:WebSocket详解与封装工具类 二、基于node搭建后台websocket服务 首先确认本机电脑中…

c# 操作Microsoft Access数据库

数据库结构为: public static string connting "数据库路径:如:D:\\xxx.mdb";//插入public bool InsertToFile(string casenumber, int lastrowid, int pagecount){bool result true;try{string connString $"ProviderMicr…

在nodeJS 中实现langchain 的Agent (实验笔记)

在nodeJS 中实现langchain 的Agent 实验过程记录如下: 1 构建一个Agent ,使用两个工具 Calculator和TavilySearchResults 2 Tavily Search的API key 的获取 之前一直找不到一个合适的搜索引擎,Google Search 被墙,bing Search …

【Linux】进程(5):命令行参数

大家好,我是苏貝,本篇博客带大家了解Linux进程(5):命令行参数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 (A)为什么要有命令…

Paraformer解读(1)基于self-attention和dfsmn的encoder

DFSMN SAN-M python实现 import torch import torch.nn as nn import torch.nn.functional as Fclass PositionalEncoding(nn.Module):def __init__(self, d_model, dropout0.1, max_len5000):super(PositionalEncoding, self).__init__()self.dropout nn.Dropout(pdropout)p…