(学习日记)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 > 0uOS_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 > 0uvoid                *DbgPrevPtr;void                *DbgNextPtr;CPU_CHAR            *DbgNamePtr;
#endif
};

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

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

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

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

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

相关文章

从OpenJDK源码看JAVA虚拟机的创建过程

这里写目录标题 关于Java跨平台能力的理解Java Virtual Machine是怎么创建的。1. Java Launcher2. JLI_Launch 入口3. JVM-Init4. 开启新线程并继续5. 调用JavaMain6. 初始化Java虚拟机,并执行Main方法java.c中的InitializeJVM 方法 7. JNI_CreateJavaVM8. 虚拟机创…

WPS的JS宏如何设置Word文档的表格的单元格文字重新编号

希望对Word文档中的表格进行统一处理,表格内的编号,有时候会出现紊乱,下一个表格的编号承接了上一个表格的编号,实际需要重新编号。 当表格比较多时,手动更改非常麻烦,而且更改一遍并不能完成,…

使用 XHbuilder 编辑器 uniapp开发 app 中使用手机本相机可直接拍摄照片进行上传,也可以选择相册进行上传

学习目标: 使用 XHbuilder 编辑器 uniapp开发 app 中使用手机本相机可直接拍摄照片进行上传,也可以选择相册进行上传 学习内容: 相关内容 上传图片上传时调用的相关方法配置的相关模块需要配置的相关权限 知识小结: 总结&#…

最大连续1的个数 ||| ---- 滑动窗口

题目链接 题目: 分析: 题目中说可以将最多k个0翻转成1, 如果我们真的这样算就会十分麻烦, 所以我们可以换一种思路: 找到一个最长的子数组, 最多有k个0解法一: 暴力解法: 找到所有的最多有k个0的子字符串, 返回最长的解法二: 找到最长的子数组, 我们可以想到"滑动窗口算…

【win10相关】更新后出现未连接到互联网的问题及解决

问题背景 在win10更新完系统之后,第二天电脑开机后,发现无法上网,尝试打开百度,但是出现以下图片: 经过检查,发现手机是可以上网的,说明网络本身并没有问题,对防火墙进行了一些设置…

C++/BOOST filesystem fs::directory_iterator一个滑稽的错误

错误来源于,用 fs::directory_iterator iter(folderPath), end; 然后for循环 for (; iter ! iter_end; iter) {} 最开始没问题,后来说加个进度条,统计一下所有文件数量,用了std::distance, int totalFiles std::…

XYCTF2024 部分w

RE 1. 聪明的信使 基础爆破 #include<stdio.h> #include<string.h> int main() {char enc[] "oujp{H0d_TwXf_Lahyc0_14_e3ah_Rvy0acwc!}";char flag[41] {0};int i, j;for (i 0; i < strlen(enc); i){for (j 33; j < 127; j){if ((j < 9…

Skill Check: Fundamentals of Large Language Models

Skill Check: Fundamentals of Large Language Models 完结&#xff01;

Vue项目中引入高德地图步骤详解,附示例代码

vue中如何使用高德地图&#xff0c;下面为您详解。 步骤一&#xff1a;安装高德地图的JavaScript API 在Vue项目的根目录下打开终端&#xff0c;执行以下命令安装高德地图的JavaScript API&#xff1a; npm install amap/amap-jsapi-loader --save 步骤二&#xff1a;创建地…

什么?你还不懂文件系统和软硬链接?

文章目录 序言认识磁盘磁盘在系统中的管理熟悉磁盘各个分区 软硬链接软链接硬链接 序言 首先熟悉一下一些专有名词(了解即可,但必须有一个概念认识) 固态:SSD,笔记本中常装的,台式机中也可以装,常见的对应接口M.2和SATA接口 磁盘:90年代常用的数据存储设备,或是现在企业级数据…

IPv4 NAT(含Cisco配置)

IPv4 NAT&#xff08;含Cisco配置&#xff09; IPv4私有空间地址 类RFC 1918 内部地址范围前缀A10.0.0.0 - 10.255.255.25510.0.0.0/8B172.16.0.0 - 172.31.255.255172.16.0.0/12C192.168.0.0 - 192.168.255.255192.168.0.0/16 这些私有地址可在企业或站点内使用&#xff0c…

从零开始的软件测试学习之旅(四)web项目工作流程介绍

WEB手工项目 项目介绍项目技术分析项目学习准备工作如何快速熟悉项目举例熟悉TPshop项目 总体系统项目介绍项目与数据库测试流程什么是软件需求需求评审 测试计划测试方案测试计划和测试方案的区别 项目介绍 满足经典三层架构:前端 后端 数据库 前端:运行在用户端的浏览器和客…

同仁堂医养拟赴港上市,养老产业的盈利难题有了答案?

提及银发经济&#xff0c;大众可能最先想到的就是养老产业&#xff0c;在市场需求推动下&#xff0c;这一细分赛道的增长已势不可挡。单从入局者的积极性就可以把握到赛道前景之广阔。 天眼查专业版数据显示&#xff0c;截至目前&#xff0c;我国拥有养老相关企业36.2万家&…

线上办理离婚快速离婚,无需双方见面异地可办

现在离婚有两种方式 一种是协议离婚&#xff0c;双方都同意的情况下&#xff0c;可以去民政局协议离婚&#xff0c;有30天冷静期&#xff0c;冷静期过后需要双方再次去民政局办理离婚手续。 另一种是诉讼离婚&#xff0c;一方不同意离婚&#xff0c;可以选择诉讼离婚。可以全…

【PPT设计】颜色对比、渐变填充、简化框线、放大镜效果、渐变形状配图、线条的使用

目录 图表颜色对比、渐变填充、简化框线放大镜效果渐变形状配图 线条的使用区分标题与说明信息区分标题与正文,区分不同含义的内容**聚焦****引导****注解****装饰** 图表 颜色对比、渐变填充、简化框线 小米汽车正式亮相&#xff01;你们都在讨论价格&#xff0c;我全程只关…

jackson.dataformat.xml 反序列化 对象中包含泛型

重点&#xff1a; JacksonXmlProperty localName 指定本地名称 JacksonXmlRootElement localName 指定root的根路径的名称&#xff0c;默认值为类名 JsonIgnoreProperties(ignoreUnknown true) 这个注解写在类上&#xff0c;用来忽略在xml中有的属性但是在类中没有的情况 Jack…

python_django农产品物流信息服务系统6m344

Python 中存在众多的 Web 开发框架&#xff1a;Flask、Django、Tornado、Webpy、Web2py、Bottle、Pyramid、Zope2 等。近几年较为流行的&#xff0c;大概也就是 Flask 和 Django 了 Flask 是一个轻量级的 Web 框架&#xff0c;使用 Python 语言编写&#xff0c;较其他同类型框…

Eclipse C++ 无法debug 问题

环境&#xff1a; ubuntu20.04 Eclipse CDT&#xff08;x86_64) 工程&#xff0c;使用的是默认的CMake Project 现象&#xff1a; 1. 使用Eclipse&#xff0c; 加了断点后&#xff0c;debug 无法停在断点&#xff1b;step over 执行后是从main 直接执行到exit &#xff…

poi-tl自定义渲染策略学习

文章目录 实现逻辑参考代码注意点 实现逻辑 自定义渲染策略实现逻辑&#xff1a; 找到模板中的表格标签render方法接收java中对应模板表格标签的所有list数据执行自定义渲染逻辑 参考代码 word模板如下&#xff1a; 实体类&#xff1a; Data public class GksxRowData {/…

Linux多进程(二)进程通信方式三 共享内存

共享内存提供了一个在多个进程间共享数据的方式&#xff0c;它们可以直接访问同一块内存区域&#xff0c;因此比使用管道或消息队列等通信机制更高效。在多进程程序中&#xff0c;共享内存通常与信号量一起使用&#xff0c;以确保对共享内存的访问是线程安全的。 一、打开/创建…