(学习日记)2024.05.10:UCOSIII第六十四节:常用的结构体(os.h文件)第三部分

之前的章节都是针对某个或某些知识点进行的专项讲解,重点在功能和代码解释。

回到最初开始学μC/OS-III系统时,当时就定下了一个目标,不仅要读懂,还要读透,改造成更适合中国宝宝体质的使用方式。在学完野火的教程后,经过几经思考,最后决定自己锦上添花,再续上几章。
这几章想达成目的如下:

  • 能够快速的上手
  • 能够控制系统的功能
  • 明白移植的过程
  • 能够根据需要的功能来裁剪源码

从第六十一章开始的章节都是熟读源码后,根据笔者的整理方法,按照某种逻辑从系统源码中抽出来的专项解释。
笔者整理方法如下

  1. 各文件夹功能介绍(每个文件夹放什么文件,哪些是移植的,哪些不需要改,哪些需要修改)
  2. 各文件功能概览(每个文件都明白有哪些东西,是系统的哪一部分)
  3. 各文件函数概览(每个文件的有什么函数,函数的作用是什么,形参是什么)
  4. 移植的本质与移植的顺序(哪些文件需要了解,哪些文件是移植的时候需要更换的)
  5. 添加与裁剪源码(添功能与删功能怎么上手)
  6. 常用的结构体列表
  7. 常用宏介绍(如何用宏来控制整个系统,启用或关闭某个功能)
  8. main函数常用的结构顺序
  9. 创建任务的流程
  10. 任务在几种队列的变化

每个整理方法会用一章或多章的篇幅来解释。

点击此处进入μC/OS-iii章节总目录

2024.05.10:UCOSIII第六十四节:常用的结构体(os.h文件)第三部分

  • 六十八、UCOSIII:常用的结构体(os.h文件)第三部分
    • OS_RDY_LIST
    • OS_TICK_SPOKE
    • OS_TMR
    • OS_TMR_SPOKE
    • OS_PEND_DATA
    • OS_PEND_LIST
    • OS_PEND_OBJ

六十八、UCOSIII:常用的结构体(os.h文件)第三部分

OS_RDY_LIST

typedef struct os_rdy_list OS_RDY_LIST;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                      READY LIST
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_rdy_list {
    OS_TCB              *HeadPtr;                           /* Pointer to task that will run at selected priority     */
    OS_TCB              *TailPtr;                           /* Pointer to last task          at selected priority     */
    OS_OBJ_QTY           NbrEntries;                        /* Number of entries             at selected priority     */
};

这个结构体定义描述了就绪列表(Ready List)。下面是结构体中各个字段的详细解释:

  1. HeadPtr: 指向就绪列表中具有最高优先级的任务的指针。在多任务系统中,任务的优先级决定了其在就绪列表中的位置,HeadPtr指向具有最高优先级的任务。
  2. TailPtr: 指向就绪列表中具有最低优先级的任务的指针。在多任务系统中,任务的优先级决定了其在就绪列表中的位置,TailPtr指向具有最低优先级的任务。
  3. NbrEntries: 表示在就绪列表中的任务数量,即就绪列表的长度。

就绪列表是操作系统内核中用于管理处于就绪状态的任务的数据结构。在多任务系统中,操作系统需要维护一个就绪列表,以便能够快速地确定下一个应该运行的任务。就绪列表根据任务的优先级进行排序,因此具有最高优先级的任务将成为下一个执行的任务。通过维护就绪列表,操作系统可以实现任务的优先级调度,从而合理地分配处理器时间,提高系统的响应性和效率。

OS_TICK_SPOKE

typedef struct os_tick_spoke OS_TICK_SPOKE;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                    TICK DATA TYPE
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_tick_spoke {
    OS_TCB              *FirstPtr;                          /* Pointer to list of tasks in tick spoke                 */
    OS_OBJ_QTY           NbrEntries;                        /* Current number of entries in the tick spoke            */
    OS_OBJ_QTY           NbrEntriesMax;                     /* Peak number of entries in the tick spoke               */
};

这个结构体定义描述了一个时钟节(Tick Spoke)。下面是结构体中各个字段的详细解释:

  1. FirstPtr: 指向时钟节中第一个任务的指针,即位于该时钟节中的第一个任务的控制块(TCB)。
  2. NbrEntries: 当前时钟节中的任务数量,即时钟节的长度。
  3. NbrEntriesMax: 时钟节中同时存在的最大任务数量,表示时钟节在任何时间点上达到的最大负载。

时钟节是操作系统内核中用于实现时钟节拍机制的数据结构。在实时操作系统中,时钟节拍是指定时间间隔内发生的一次系统时钟脉冲。时钟节用于分割系统时钟周期,将任务按照其定时要求组织到不同的时钟节中。通过维护时钟节,操作系统可以轻松地管理任务的定时要求,并在适当的时候唤醒这些任务。时钟节通常被实现为一个链表或数组结构,其中包含了当前时钟节中的所有任务,并记录了时钟节的状态信息。

OS_TMR

typedef struct os_tmr OS_TMR;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                   TIMER DATA TYPES
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_tmr {
    OS_OBJ_TYPE          Type;
    CPU_CHAR            *NamePtr;                           /* Name to give the timer                                 */
    OS_TMR_CALLBACK_PTR  CallbackPtr;                       /* Function to call when timer expires                    */
    void                *CallbackPtrArg;                    /* Argument to pass to function when timer expires        */
    OS_TMR              *NextPtr;                           /* Double link list pointers                              */
    OS_TMR              *PrevPtr;
    OS_TICK              Match;                             /* Timer expires when OSTmrTickCtr matches this value     */
    OS_TICK              Remain;                            /* Amount of time remaining before timer expires          */
    OS_TICK              Dly;                               /* Delay before start of repeat                           */
    OS_TICK              Period;                            /* Period to repeat timer                                 */
    OS_OPT               Opt;                               /* Options (see OS_OPT_TMR_xxx)                           */
    OS_STATE             State;
#if OS_CFG_DBG_EN > 0u
    OS_TMR              *DbgPrevPtr;
    OS_TMR              *DbgNextPtr;
#endif
};

这个结构体定义描述了一个定时器(Timer)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,应设置为 OS_OBJ_TYPE_TMR,表示这是一个定时器对象。
  2. NamePtr: 定时器的名称,用于标识定时器。
  3. CallbackPtr: 定时器到期时要调用的回调函数的指针。
  4. CallbackPtrArg: 传递给回调函数的参数指针,即在定时器到期时要传递给回调函数的参数。
  5. NextPtrPrevPtr: 双向链表指针,用于将定时器链接到定时器列表中的下一个和上一个定时器。
  6. Match: 定时器到期的匹配值,表示当系统时钟计数器(OSTmrTickCtr)达到该值时,定时器将到期。
  7. Remain: 定时器到期前剩余的时间,表示从当前系统时钟计数器的值到定时器到期时剩余的时间。
  8. Dly: 定时器启动前的延迟时间,表示定时器启动之前要等待的时间。
  9. Period: 定时器重复周期,表示定时器到期后要重启的时间间隔。
  10. Opt: 定时器的选项,用于指定定时器的行为,例如单次触发还是重复触发。
  11. State: 定时器的状态,表示定时器当前的状态,如启动、停止等。

在这里插入图片描述

定时器是一种用于在指定时间间隔内执行特定操作的机制。通过设置定时器的到期时间和回调函数,可以在定时器到期时执行特定的任务或操作。定时器通常用于实现任务调度、超时处理、周期性任务等功能,在实时系统中具有广泛的应用。

OS_TMR_SPOKE

typedef struct os_tmr_spoke OS_TMR_SPOKE;

struct  os_tmr_spoke {
    OS_TMR              *FirstPtr;                          /* Pointer to first timer in linked list                  */
    OS_OBJ_QTY           NbrEntries;
    OS_OBJ_QTY           NbrEntriesMax;
};

这个结构体定义描述了一个定时器节(Timer Spoke)。下面是结构体中各个字段的详细解释:

  1. FirstPtr: 指向定时器链表中第一个定时器的指针,即位于该定时器节中的第一个定时器。
  2. NbrEntries: 当前定时器节中的定时器数量,即定时器节的长度。
  3. NbrEntriesMax: 定时器节中同时存在的最大定时器数量,表示定时器节在任何时间点上达到的最大负载。

定时器节是操作系统内核中用于实现定时器管理的数据结构之一。在实时操作系统中,定时器通常会根据其到期时间被组织到不同的定时器节中,以便更快速地查询和处理到期的定时器。定时器节通常被实现为一个链表或数组结构,其中包含了当前定时器节中的所有定时器,并记录了定时器节的状态信息。

OS_PEND_DATA

typedef struct os_pend_data OS_PEND_DATA;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                PEND DATA and PEND LIST
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_pend_data {
    OS_PEND_DATA        *PrevPtr;
    OS_PEND_DATA        *NextPtr;
    OS_TCB              *TCBPtr;
    OS_PEND_OBJ         *PendObjPtr;
    OS_PEND_OBJ         *RdyObjPtr;
    void                *RdyMsgPtr;
    OS_MSG_SIZE          RdyMsgSize;
    CPU_TS               RdyTS;
};

这个结构体定义描述了挂起数据(Pend Data),以及挂起列表(Pend List)中的一个条目。下面是结构体中各个字段的详细解释:

  1. PrevPtr: 指向挂起列表中前一个条目的指针,用于在挂起列表中链接前一个条目。
  2. NextPtr: 指向挂起列表中下一个条目的指针,用于在挂起列表中链接下一个条目。
  3. TCBPtr: 指向挂起的任务控制块(TCB)的指针,表示与此挂起数据相关联的任务。
  4. PendObjPtr: 指向挂起的对象(如信号量、消息队列等)的指针,表示导致任务挂起的对象。
  5. RdyObjPtr: 指向就绪的对象(通常是与PendObjPtr相同的对象)的指针,表示导致任务从挂起状态转换为就绪状态的对象。
  6. RdyMsgPtr: 如果任务挂起于消息队列,该字段指向就绪消息的指针。
  7. RdyMsgSize: 如果任务挂起于消息队列,该字段表示就绪消息的大小。
  8. RdyTS: 就绪时间戳,表示任务从挂起状态转换为就绪状态的时间。

挂起数据和挂起列表通常用于实现任务挂起和恢复的机制。当任务等待某个条件的发生时,它可以被挂起,并将相关信息存储在挂起数据中。一旦条件满足,任务将从挂起状态转换为就绪状态,并通过挂起列表中的挂起数据恢复执行。这种机制允许任务在等待外部事件发生时释放CPU资源,从而提高系统的效率和响应性。

OS_PEND_LIST

typedef struct os_pend_list OS_PEND_LIST;

struct  os_pend_list {
    OS_PEND_DATA        *HeadPtr;
    OS_PEND_DATA        *TailPtr;
    OS_OBJ_QTY           NbrEntries;
};

这个结构体定义描述了挂起列表(Pend List)。下面是结构体中各个字段的详细解释:

  1. HeadPtr: 指向挂起列表中第一个挂起数据的指针,即位于该挂起列表中的第一个挂起数据的指针。
  2. TailPtr: 指向挂起列表中最后一个挂起数据的指针,即位于该挂起列表中的最后一个挂起数据的指针。
  3. NbrEntries: 挂起列表中的挂起数据数量,即挂起列表的长度。

挂起列表通常用于在操作系统中管理任务的挂起状态。当任务等待某个事件发生时,它将被挂起,并将相关信息存储在挂起列表中。挂起列表可以是一个队列、链表或其他数据结构,用于存储和管理所有挂起的任务。通过挂起列表,操作系统可以轻松地管理挂起的任务,并在适当的时候恢复它们的执行。

OS_PEND_OBJ

typedef struct os_pend_obj OS_PEND_OBJ;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                       PEND OBJ
*
* Note(s) : (1) The 'os_pend_obj' structure data type is a template/subset for specific kernel objects' data types: 
*               'os_flag_grp', 'os_mutex', 'os_q', and 'os_sem'.  Each specific kernel object data type MUST define 
*               ALL generic OS pend object parameters, synchronized in both the sequential order & data type of each 
*               parameter.
*
*               Thus, ANY modification to the sequential order or data types of OS pend object parameters MUST be 
*               appropriately synchronized between the generic OS pend object data type & ALL specific kernel objects' 
*               data types.
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_pend_obj {
    OS_OBJ_TYPE          Type;
    CPU_CHAR            *NamePtr;
    OS_PEND_LIST         PendList;                          /* List of tasks pending on object                        */
#if OS_CFG_DBG_EN > 0u
    void                *DbgPrevPtr;
    void                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
};

这个结构体定义描述了挂起对象(Pend Object)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,表示该挂起对象所属的对象类型。不同的对象类型(如事件标志组、互斥量、消息队列、信号量等)都有不同的类型。
  2. NamePtr: 指向对象的名称的指针,通常是一个以NUL终止的ASCII字符串,用于标识该挂起对象。
  3. PendList: 挂起列表,用于存储等待该对象的任务的挂起数据。
  4. DbgPrevPtrDbgNextPtrDbgNamePtr: 调试目的的前一个和后一个挂起对象指针以及挂起对象名称的指针。

挂起对象是操作系统内核中用于实现任务挂起和恢复的机制。不同类型的内核对象(如事件标志组、互斥量、消息队列、信号量等)都有自己的挂起对象。当任务等待某个内核对象时,它将被挂起,并将相关信息存储在该内核对象的挂起列表中。挂起列表可以是一个队列、链表或其他数据结构,用于存储和管理所有挂起的任务。通过挂起对象和挂起列表,操作系统可以轻松地管理挂起的任务,并在适当的时候恢复它们的执行。

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

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

相关文章

设计模式——保护性暂停

同步模式之保护性暂停 文章目录 同步模式之保护性暂停定义实现应用带超时版 GuardedObject扩展——原理之join扩展——多任务版 GuardedObject 定义 即 Guarded Suspension,用在一个线程等待另一个线程的执行结果 要点 有一个结果需要从一个线程传递到另一个线程&…

【逆向百例】百度翻译js逆向

关注它,不迷路。 本文章中所有内容仅供学习交流,不可用于任何商业用途和非法用途,否则后果自负! 前言 目标 分析某度翻译接口,使用python获取翻译结果,并用pyinstaller打包成单文件可执行程序。 工具 ch…

python自定义交叉熵损失,再和pytorch api对比

背景 我们知道,交叉熵本质上是两个概率分布之间差异的度量,公式如下 其中概率分布P是基准,我们知道H(P,Q)>0,那么H(P,Q)越小,说明Q约接近P。 损失函数本质上也是为了度量模型和完美模型的差异,因此可以…

理解红黑树结构

红黑树的特性 节点是红色或黑色根是黑色叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),下图中的那些null节点才是叶子节点,null节点的父节点在…

偏微分方程算法之五点菱形差分法

目录 一、研究目标 二、理论推导 三、算例实现 四、结论 一、研究目标 上个专栏我们介绍了双曲型偏微分方程的主要算法及实现。从今天开始,我们在新的专栏介绍另一种形式偏微分方程-椭圆型的解法。 研究目标选取经典的二维椭圆型方程(也称泊松Poisso…

选对伪原创改写软件,文章写作不犯难!

文章写作在当下火热的自媒体的行业中是一项非常重要的技能,只要是参与做自媒体的朋友,想要在内容输出方面不出现困难的情况,那么文章写作的技能基本要具备,但是我们依然能看到有很多不擅长写作的朋友也做起了自媒体,并…

高扬程水泵的性能与应用领域 /恒峰智慧科技

在现代社会中,科技的发展为我们的生活带来了无数便利和可能性。其中,高扬程水泵作为一种高效能的水泵,其独特的设计使其在各个领域都有着广泛的应用,尤其是在森林消防中。 一、高扬程水泵的性能 1. 高扬程:高扬程水泵…

SpringCloud-Seata分布式事务的环境搭建搭建

目录 一、版本说明 二、建立Seata Server数据库(TC-带头大哥的数据库) 三、业务库建表 四、安装Seata-Server 4.1 虚拟机里新建一个/opt/seate/seata-server文件夹,在seate文件夹下新建一个docker-compose.yml 文件 4.2 运行容器 4.3 在na…

vue为遍历生成的表单设置ref属性

最近在写表单重置的时候出现了问题&#xff0c;在this.$refs[formName].resetFields();的时候卡了很久。 经过网上的搜索终于解决的问题&#xff01; 对于不需要遍历的表单 这是vue代码&#xff1a; <el-dialog title"段落描述" :visible.sync"dialogFormV…

从零开始的Dify大模型应用开发指南

大模型相关目录 大模型&#xff0c;包括部署微调prompt/Agent应用开发、知识库增强、数据库增强、知识图谱增强、自然语言处理、多模态等大模型应用开发内容 从0起步&#xff0c;扬帆起航。 大模型应用向开发路径&#xff1a;AI代理工作流大模型应用开发实用开源项目汇总大模…

【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)

【Paddle】PCA线性代数基础及领域应用 写在最前面一、PCA线性代数基础1. PCA的算法原理2. PCA的线性代数基础2.1 标准差 Standard Deviation2.2 方差 Variance2.3 协方差 Covariance2.4 协方差矩阵 The Covariance Matrix2.5 paddle代码demo①&#xff1a;计算协方差矩阵2.6 特…

【方法】PPT文件如何撤销密码保护?

对于重要的PPT文件&#xff0c;很多人会设置密码保护&#xff0c;那后续不需要保护的时候&#xff0c;要怎么撤销密码呢&#xff1f; 首先&#xff0c;我们要看下想要撤销的是什么密码&#xff0c;以及在记得密码或者忘记密码的情况下&#xff0c;处理方式也不同&#xff0c;下…

保证接口幂等性的多种实现方式(数据库方案)

1. 幂等性的概念 接口幂等性是指在软件工程和Web服务领域中&#xff0c;一个接口&#xff08;通常是HTTP API&#xff09;无论被调用一次还是多次&#xff0c;其对系统产生的副作用应该是相同的&#xff0c;即结果保持一致&#xff0c;不会因为多次请求而有所不同。换句话说&am…

nginx--安装

yum安装 官方包链接&#xff1a;nginx: Linux packages 官方yum源链接&#xff1a;nginx: Linux packages 配置yum源 [rootlocalhost ~]# yum install -y nginx [nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/$releasever/$basearch/ gp…

嵌入式学习62-C++

知识零碎&#xff1a; 析构函数语法&#xff1a; ~类名(){} 1.析构函数&#xff0c;没有返回值也不写void 2.析构函数是构造函数的反过程 构造函数 在执行过程中的三个过程…

【C++初阶】string

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

客户端连接ZK失败处理方案

文章目录 背景介绍报错信息处理方案第一步、查看zookeeper启动是否正常第二步、检查本地网络是否正常第三步、检查本地JDK版本 对于zookeeper服务注册中心&#xff0c;在前期【 Dubbo框架注册中心-Zookeeper搭建】博客中有环境搭建部署介绍&#xff0c;感兴趣可以参考安装。 背…

第七天 dfs剪枝优化

第七天 dfs剪枝&优化 1可行性剪枝 2最优性剪枝 3重复性剪枝 题 1 输入 5 5 6 …S. XX.X. …X… …D.X …X… 输出 YES —————————————— 题解 #include<iostream> #include<cstdio> using namespace std; const int N 10; int n,m,T; char …

前端入门:HTML(CSS边距,塌陷)

1.CSS边距 auto:浏览器自动计算的边距 length&#xff1a;以px,pt,cm等为单位指定边距&#xff0c;pt代表的是磅&#xff0c;1磅0.376毫米。 %&#xff1a;以父元素宽度的百分比来指定边距。 其中&#xff0c;length和%都可以取负值&#xff0c;表示减少外边距的空间大小。 …

命令执行。

命令执行 在该项目的readme中&#xff0c;描述了怎么去调用的flink 通过java原生的runtime来调用flink&#xff0c;下一步就是去看看具体的调用过程了&#xff0c;是否存在可控的参数 找到具体提交命令的类方法CommandRpcClinetAdapterImpl#submitJob() 这里要确定command&am…
最新文章