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

news2024/11/16 3:47:40

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

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

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

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

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

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

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

2024.05.08:UCOSIII第六十二节:常用的结构体(os.h文件)第一部分

  • 六十八、UCOSIII:常用的结构体(os.h文件)第一部分
    • OS_TCB
    • OS_SEM
    • OS_FLAG_GRP

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

OS_TCB

typedef struct os_tcb OS_TCB;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                  TASK CONTROL BLOCK
------------------------------------------------------------------------------------------------------------------------
*/

struct os_tcb {
    CPU_STK             *StkPtr;                            /* Pointer to current top of stack                        */

    void                *ExtPtr;                            /* Pointer to user definable data for TCB extension       */

    CPU_STK             *StkLimitPtr;                       /* Pointer used to set stack 'watermark' limit            */

    OS_TCB              *NextPtr;                           /* Pointer to next     TCB in the TCB list                */
    OS_TCB              *PrevPtr;                           /* Pointer to previous TCB in the TCB list                */

    OS_TCB              *TickNextPtr;
    OS_TCB              *TickPrevPtr;

    OS_TICK_SPOKE       *TickSpokePtr;                      /* Pointer to tick spoke if task is in the tick list      */

    CPU_CHAR            *NamePtr;                           /* Pointer to task name                                   */

    CPU_STK             *StkBasePtr;                        /* Pointer to base address of stack                       */

#if defined(OS_CFG_TLS_TBL_SIZE) && (OS_CFG_TLS_TBL_SIZE > 0u)
    OS_TLS               TLS_Tbl[OS_CFG_TLS_TBL_SIZE];
#endif

    OS_TASK_PTR          TaskEntryAddr;                     /* Pointer to task entry point address                    */
    void                *TaskEntryArg;                      /* Argument passed to task when it was created            */

    OS_PEND_DATA        *PendDataTblPtr;                    /* Pointer to list containing objects pended on           */
    OS_STATE             PendOn;                            /* Indicates what task is pending on                      */
    OS_STATUS            PendStatus;                        /* Pend status                                            */

    OS_STATE             TaskState;                         /* See OS_TASK_STATE_xxx                                  */
    OS_PRIO              Prio;                              /* Task priority (0 == highest)                           */
    CPU_STK_SIZE         StkSize;                           /* Size of task stack (in number of stack elements)       */
    OS_OPT               Opt;                               /* Task options as passed by OSTaskCreate()               */

    OS_OBJ_QTY           PendDataTblEntries;                /* Size of array of objects to pend on                    */

    CPU_TS               TS;                                /* Timestamp                                              */

    OS_SEM_CTR           SemCtr;                            /* Task specific semaphore counter                        */

                                                            /* DELAY / TIMEOUT                                        */
    OS_TICK              TickCtrPrev;                       /* Previous time when task was            ready           */
    OS_TICK              TickCtrMatch;                      /* Absolute time when task is going to be ready           */
    OS_TICK              TickRemain;                        /* Number of ticks remaining for a match (updated at ...  */
                                                            /* ... run-time by OS_StatTask()                          */
    OS_TICK              TimeQuanta;
    OS_TICK              TimeQuantaCtr;

#if OS_MSG_EN > 0u
    void                *MsgPtr;                            /* Message received                                       */
    OS_MSG_SIZE          MsgSize;
#endif

#if OS_CFG_TASK_Q_EN > 0u
    OS_MSG_Q             MsgQ;                              /* Message queue associated with task                     */
#if OS_CFG_TASK_PROFILE_EN > 0u
    CPU_TS               MsgQPendTime;                      /* Time it took for signal to be received                 */
    CPU_TS               MsgQPendTimeMax;                   /* Max amount of time it took for signal to be received   */
#endif
#endif

#if OS_CFG_TASK_REG_TBL_SIZE > 0u
    OS_REG               RegTbl[OS_CFG_TASK_REG_TBL_SIZE];  /* Task specific registers                                */
#endif

#if OS_CFG_FLAG_EN > 0u
    OS_FLAGS             FlagsPend;                         /* Event flag(s) to wait on                               */
    OS_FLAGS             FlagsRdy;                          /* Event flags that made task ready to run                */
    OS_OPT               FlagsOpt;                          /* Options (See OS_OPT_FLAG_xxx)                          */
#endif

#if OS_CFG_TASK_SUSPEND_EN > 0u
    OS_NESTING_CTR       SuspendCtr;                        /* Nesting counter for OSTaskSuspend()                    */
#endif

#if OS_CFG_TASK_PROFILE_EN > 0u
    OS_CPU_USAGE         CPUUsage;                          /* CPU Usage of task (0.00-100.00%)                       */
    OS_CPU_USAGE         CPUUsageMax;                       /* CPU Usage of task (0.00-100.00%) - Peak                */
    OS_CTX_SW_CTR        CtxSwCtr;                          /* Number of time the task was switched in                */
    CPU_TS               CyclesDelta;                       /* value of OS_TS_GET() - .CyclesStart                    */
    CPU_TS               CyclesStart;                       /* Snapshot of cycle counter at start of task resumption  */
    OS_CYCLES            CyclesTotal;                       /* Total number of # of cycles the task has been running  */
    OS_CYCLES            CyclesTotalPrev;                   /* Snapshot of previous # of cycles                       */

    CPU_TS               SemPendTime;                       /* Time it took for signal to be received                 */
    CPU_TS               SemPendTimeMax;                    /* Max amount of time it took for signal to be received   */
#endif

#if OS_CFG_STAT_TASK_STK_CHK_EN > 0u
    CPU_STK_SIZE         StkUsed;                           /* Number of stack elements used from the stack           */
    CPU_STK_SIZE         StkFree;                           /* Number of stack elements free on   the stack           */
#endif

#ifdef CPU_CFG_INT_DIS_MEAS_EN
    CPU_TS               IntDisTimeMax;                     /* Maximum interrupt disable time                         */
#endif
#if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0u
    CPU_TS               SchedLockTimeMax;                  /* Maximum scheduler lock time                            */
#endif

#if OS_CFG_DBG_EN > 0u
    OS_TCB              *DbgPrevPtr;
    OS_TCB              *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
};

这是一个任务控制块(Task Control Block,TCB)的结构体定义,用于描述操作系统中的一个任务。

  1. StkPtr: 指向任务当前堆栈顶部的指针。
  2. ExtPtr: 指向用于TCB扩展的用户可定义数据的指针。
  3. StkLimitPtr: 用于设置堆栈水位线的指针。
  4. NextPtr: 指向TCB列表中下一个TCB的指针。
  5. PrevPtr: 指向TCB列表中前一个TCB的指针。
  6. TickNextPtrTickPrevPtr: 用于在定时器中跟踪任务的下一个和前一个节点。
  7. TickSpokePtr: 如果任务在定时器列表中,则指向定时器轮中的节点。
  8. NamePtr: 指向任务名称的指针。
  9. StkBasePtr: 指向堆栈基地址的指针。
  10. TLS_Tbl: 如果配置了线程本地存储,则用于存储线程本地存储的数组。
  11. TaskEntryAddr: 任务入口点地址的指针。
  12. TaskEntryArg: 任务创建时传递的参数。
  13. PendDataTblPtr: 指向包含任务挂起的对象列表的指针。
  14. PendOn: 表示任务当前挂起在哪个对象上。
  15. PendStatus: 指示挂起状态。
  16. TaskState: 任务状态。
  17. Prio: 任务优先级。
  18. StkSize: 任务堆栈大小。
  19. Opt: 通过OSTaskCreate()传递的任务选项。
  20. PendDataTblEntries: 挂起对象数组的大小。
  21. TS: 时间戳。
  22. SemCtr: 任务特定的信号量计数器。
  23. TickCtrPrev: 任务上次准备就绪的时间。
  24. TickCtrMatch: 任务下次准备就绪的绝对时间。
  25. TickRemain: 到达匹配的剩余滴答数。
  26. TimeQuantaTimeQuantaCtr: 时间片轮转的时间片大小和剩余计数。
  27. MsgPtrMsgSize: 如果启用了消息队列,则用于存储接收到的消息和消息大小。
  28. MsgQ: 与任务关联的消息队列。
  29. RegTbl: 任务特定的寄存器数组。
  30. FlagsPendFlagsRdyFlagsOpt: 如果启用了事件标志,则用于等待的事件标志、使任务准备就绪的事件标志以及标志选项。
  31. SuspendCtr: 用于跟踪任务挂起的嵌套计数器。
  32. CPUUsageCPUUsageMax: 任务的CPU使用率和最大CPU使用率。
  33. CtxSwCtrCyclesDeltaCyclesStartCyclesTotalCyclesTotalPrev: 任务的上下文切换次数和与CPU周期相关的一些计数器。
  34. StkUsedStkFree: 任务堆栈中已使用和剩余的堆栈元素数量。
  35. IntDisTimeMaxSchedLockTimeMax: 最大中断禁用时间和最大调度器锁定时间,用于性能测量。
  36. DbgPrevPtrDbgNextPtrDbgNamePtr: 调试目的的前一个和后一个TCB指针以及任务名称的指针。

OS_SEM

typedef struct os_sem OS_SEM;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                      SEMAPHORES
*
* Note(s) : See  PEND OBJ  Note #1'.
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_sem {                                            /* Semaphore                                              */
                                                            /* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_SEM                       */
    CPU_CHAR            *NamePtr;                           /* Pointer to Semaphore Name (NUL terminated ASCII)       */
    OS_PEND_LIST         PendList;                          /* List of tasks waiting on semaphore                     */
#if OS_CFG_DBG_EN > 0u
    OS_SEM              *DbgPrevPtr;
    OS_SEM              *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
                                                            /* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_SEM_CTR           Ctr;
    CPU_TS               TS;
};

这个结构体定义描述了一个信号量(Semaphore)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,应设置为 OS_OBJ_TYPE_SEM,表示这是一个信号量对象。
  2. NamePtr: 指向信号量名称的指针,通常是一个以NUL终止的ASCII字符串。
  3. PendList: 等待信号量的任务列表,用于存储等待该信号量的任务的信息。
  4. DbgPrevPtrDbgNextPtrDbgNamePtr: 调试目的的前一个和后一个信号量指针以及信号量名称的指针。
  5. Ctr: 信号量计数器,表示信号量当前的可用资源数量。
  6. TS: 时间戳,记录信号量的最近更新时间。

在这里插入图片描述
如果我们创建一个初始可用信号量个数为5的信号量,那么信号量创建成功的示意图具体见图
在这里插入图片描述

这个结构体包含了信号量的一般属性,例如名称、等待队列以及用于调试的指针,以及特定属性,例如信号量的计数器和时间戳。信号量是一种常用的同步原语,用于控制多任务环境中的资源访问。

OS_FLAG_GRP

typedef struct os_flag_grp OS_FLAG_GRP;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                     EVENT FLAGS
*
* Note(s) : See  PEND OBJ  Note #1'.
------------------------------------------------------------------------------------------------------------------------
*/


struct  os_flag_grp {                                       /* Event Flag Group                                       */
                                                            /* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_FLAG                      */
    CPU_CHAR            *NamePtr;                           /* Pointer to Event Flag Name (NUL terminated ASCII)      */
    OS_PEND_LIST         PendList;                          /* List of tasks waiting on event flag group              */
#if OS_CFG_DBG_EN > 0u
    OS_FLAG_GRP         *DbgPrevPtr;
    OS_FLAG_GRP         *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
                                                            /* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_FLAGS             Flags;                             /* 8, 16 or 32 bit flags                                  */
    CPU_TS               TS;                                /* Timestamp of when last post occurred                   */
};

这个结构体定义描述了一个事件标志组(Event Flag Group)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,应设置为 OS_OBJ_TYPE_FLAG,表示这是一个事件标志组对象。
  2. NamePtr: 指向事件标志组名称的指针,通常是一个以NUL终止的ASCII字符串。
  3. PendList: 等待事件标志组的任务列表,用于存储等待该事件标志组的任务的信息。
  4. DbgPrevPtrDbgNextPtrDbgNamePtr: 调试目的的前一个和后一个事件标志组指针以及事件标志组名称的指针。
  5. Flags: 事件标志,可以是8、16或32位,用于表示不同的事件状态。
  6. TS: 时间戳,记录事件标志组的最近一次操作时间。

在这里插入图片描述
如果我们创建一个事件,那么事件创建成功的示意图具体见图
在这里插入图片描述

事件标志组是一种用于多任务系统中任务间通信和同步的机制,它允许任务等待某些事件的发生,并在事件发生时被唤醒。该结构体包含了事件标志组的一般属性,例如名称、等待队列以及用于调试的指针,以及特定属性,例如事件标志和时间戳。

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

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

相关文章

Java基础教程- 1 Java 简介

更好的阅读体验:点这里 ( www.doubibiji.com ) 1 Java 简介 1.1 Java语言概述 1.1.1 Java是什么 (了解一下即可,对学习没影响,总得了解一下它是怎么来滴~) Java是由Sun公司(已…

五一景点预约怎么预约 预约时间用备忘录设置提醒不怕错过

五一小长假即将来临,相信很多人和我一样,已经跃跃欲试,准备踏上旅途,去探索那些心仪已久的风景名胜。但在这个旅游高峰期,不少热门景点都需要提前预约购票。那么,怎么预约才能确保顺利游览呢? …

在智慧城市的建设中智能电表发挥什么作用

在智慧城市的建设中,智能电表扮演着至关重要的角色。智慧城市是一个利用信息技术手段提升城市运行效率和质量的新型城市模式,旨在通过信息和通信技术的应用,提高城市管理、公共服务、环境保护等方面的质量和效率,促进城市的可持续…

金价大跳水,美梦变噩梦!2024真正适合普通人的靠谱创业项目!2024适合30-40岁轻资产小生意

4月22日晚间,向上“狂飙”了一个多月的金价突然就“大跳水”。当日,每克金价均下调14块。在这次跳水中,有人欢喜有人愁:有投资者自报做空金价一夜狂赚14万,也有投资者哭诉,头晚进货到早上就净亏损2万&#…

中电金信:GienTech动态| 获奖、合作、与伙伴共谋数字化转型…

—— —— GienTech动态 —— —— 中电金信携“源启”亮相第十二届中国电子信息博览会 4月11日,为期三天的“第十二届中国电子信息博览会”在深圳顺利闭幕。中国电子信息博览会是中国规模最大、最具国际影响力的电子信息产业盛会之一。本届大会以“全球视野&#x…

AI预测福彩3D第9套算法实战化测试第6弹2024年4月28日第6次测试

今天继续进行新算法的测试,今天是第6次测试。好了,废话不多说了,直接上图上结果。 2024年4月28日福彩3D预测结果 6码定位方案如下: 百位:5、4、9、3、1、0 十位:2、3、5、6、1、7 个位:4、5、0、…

Goby 漏洞发布|禅道 /api.php/v1/users 未授权访问漏洞

漏洞名称:禅道 /api.php/v1/users 未授权访问漏洞 English Name:Zen Road /api.php/v1/users Unauthorized Access Vulnerability CVSS core: 9.8 影响资产数:69265 漏洞描述: 禅道是一款开源的项目管理软件,旨在…

Leetcode—1017. 负二进制转换【中等】(string列表初始化、反向迭代器)

2024每日刷题(120) Leetcode—1017. 负二进制转换 实现代码 class Solution { public:string baseNeg2(int n) {string ans;while(n ! 0) {ans to_string(n & 1);n -(n >> 1);}return ans.empty() ? "0": string{ans.rbegin(),…

Linux安装Matlab运行时

一般而言,安装Matlab的linux系统是带桌面版的,如果没带,不在本教程范围内。 一、下载Matlab 下载地址:MATLAB Runtime - MATLAB Compiler - MATLAB 本教程使用R2020b(9.9) 二、linux系统中进行解压 将zip传入linux系统&#xf…

vue2主体页面进行拆分

目录 一.组件化 二.新建Header.vue页面 三.Aside.vue代码 四.Main.vue代码如下 五.Home.vue代码如下 六.index.js代码如下: 七.项目效果图 在Vue.js 2中,将主体页面进行拆分是一种常见的做法,它有助于提高代码的可维护性和可读性。页面…

Halcon 3D 使用3D ROI截取模型

Halcon 3D 使用3D ROI截取模型 链接:https://pan.baidu.com/s/1UfFyZ6y-EFq9jy0T_DTJGA 提取码:ewdi * 1.读取图片 ****************

新装电脑Flutter环境部署坑汇总(持续更新)

1.本地安装,安装fvm的坑 本人电脑使用windows ,安装fvm则一般使用choco安装,那么首先需要安装choco,打开powershell/或者cmd运行以下命令: Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager…

word启动缓慢之Baidu Netdisk Word Addin

word启动足足花了7秒钟,你知道我这7秒是怎么过来的吗? 原因就是我们可爱的百度网盘等APP,在我们安装客户端时,默认安装了Office加载项,不仅在菜单栏上加上了一个丑陋的字眼,也拖慢了word启动速度........ 解…

STM32H750片外QSPI下载算法文件(stldr)生成

STM32H750片外QSPI下载算法文件(stldr)生成 🌿相关篇《STM32H750片外QSPI启动配置简要》📌参考实现资料: https://github.com/lchnu/STM32H750XBH_ARTPIQSPI_W25Q64JV https://gitee.com/wangchief/H750_W25QXX ✨利…

链路层安全扩展——L2TP协议

链路层安全扩展——L2TP协议 PPP协议 协议概念 说到数据链路层的安全协议,我们不得不先提一下PPP协议,后面的PAP、CHAP与L2TP协议都是围绕它展开的。(PPP不是本文重点,很多细节没有提到,到时候会专开一篇文章讲PPP&…

Java 8 Stream API的使用

一、什么是Stream? Stream(流)是一个来自数据源的元素队列,它可以支持聚合操作。 数据源:流的数据来源,构造Stream对象的数据源,比如通过一个List来构造Stream对象,这个List就是数…

ardupilot开发 --- RealSense-D400 篇

目录 0. 一些概念1. 用windows检查设备是否正常1. 使用 Intel RealSense SDK 2.0 查看相机图像数据 0. 一些概念 官网:添加链接描述选型:D455 1. 用windows检查设备是否正常 用USB连接D455与PC 下载 Intel.RealSense.Viewer.exe 并打开,设…

ACE框架学习3

ACE Acceptor-Connector框架 该框架实现 Acceptor-Connector 模式,该模式解除了“网络化应用中的协作对端服务的连接和初始化”与“连接和初始化之后它们所执行的处理”的耦合。Acceptor-Connector 框架允许成用独立于它们所提供的服务来配置其连接布局的关键属性。…

正版软件 | Reg Organizer - 适用于 Windows 的注册表清理工具软件 教程分享

什么是 Reg Organizer ? Reg Organizer 是一套用于维护和优化 Windows 操作系统的工具。 通过使用 Reg Organizer,您可以清理系统中无用的文件,优化启动应用程序,编辑 Windows 注册表,搜索和替换注册表项和值&#…

Xtuner微调笔记

Xtuner学习视频 两种微调范式 在指令微调的过程中,需要高质量的对话数据。 而构建高质量的对话(指令)数据,则涉及到以下流程 先通过system/user/assistant的json格式来构造对话模板,把问题和期望模型做出的回答通过…