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

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

回到最初开始学μ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];
#endifOS_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 > 0uvoid                *MsgPtr;                            /* Message received                                       */OS_MSG_SIZE          MsgSize;
#endif#if OS_CFG_TASK_Q_EN > 0uOS_MSG_Q             MsgQ;                              /* Message queue associated with task                     */
#if OS_CFG_TASK_PROFILE_EN > 0uCPU_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 > 0uOS_REG               RegTbl[OS_CFG_TASK_REG_TBL_SIZE];  /* Task specific registers                                */
#endif#if OS_CFG_FLAG_EN > 0uOS_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 > 0uOS_NESTING_CTR       SuspendCtr;                        /* Nesting counter for OSTaskSuspend()                    */
#endif#if OS_CFG_TASK_PROFILE_EN > 0uOS_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 > 0uCPU_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_ENCPU_TS               IntDisTimeMax;                     /* Maximum interrupt disable time                         */
#endif
#if OS_CFG_SCHED_LOCK_TIME_MEAS_EN > 0uCPU_TS               SchedLockTimeMax;                  /* Maximum scheduler lock time                            */
#endif#if OS_CFG_DBG_EN > 0uOS_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 > 0uOS_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 > 0uOS_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.xdnf.cn/news/1409796.html

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

相关文章

blender(布兰德)下载安装-windows系统安装

1.简单介绍 这些介绍都是一些百科或官网提供的内容,直接搜索对应的信息后即可看到。Blender(布兰德)是一款永久开源免费的3D创建套件。支持整个3D创作流程:建模、雕刻、骨骼装配、动画、模拟、实时渲染、合成和运动跟踪&#xff…

Java Maven 编译资源文件拷贝错误 dirCompressed.zip failed with MalformedInputException:

完整的错误信息为: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.3.1:resources (default-resources) on project core-java-io: filtering C:\WorkDir\Repository\iSharkfly-Docs\java-tutorials\core-java-modules\core-ja…

Microsoft.NET 框架程序设计 —— 共享程序集

文件版本是一个很难解决的问题。实际上,如果仅仅在一个文件中将其某一位从0改变到1、或者从1改变到0,我们便不能绝对保证使用原来文件的代码和它使用新版文件时的行为一样。这是因为许多应用程序都会有意或者无意地引入bug。如果一个文件的后续版本修复了一个bug,应用程序便…

第12章 软件测试基础(第一部分)概念、质量保证、测试用例、测试执行过程

一、软件测试 (一)定义 动态验证计算机程序对有限的测试用例集是否可产生期望的结果的过程。测试计划是描述了要进行的测试活动的范围、方法、资源和进度的文档。编写测试计划目的:使测试工作顺利进行、使项目参与人员沟通更舒畅、使测试工…

翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习六

合集 ChatGPT 通过图形化的方式来理解 Transformer 架构 翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习一翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深度学习二翻译: 什么是ChatGPT 通过图形化的方式来理解 Transformer 架构 深…

用FPGA+DAC输出“心”形波

1.前言 之前在做信号处理的时候整了一下活,用FPGADAC(数模转换器),输出了一个爱心形状的波形,今天整理资料的时候偶然发现了他,现在把他分享出来。当时将DAC的输出接在示波器上显示如下图所示: …

雅思备考经验(个人向)

IELTS备考经验(个人向) 备考时长约1个月, 首考6.5(6), 虽然没考到小分6.5, 我也接受了, 过段时间再考吧. 机考or纸笔 雅思有机考也有传统的纸笔考试形式, 个人更推荐机考, 原因如下: 机考口语和笔试一般都在同一天, 而纸笔的口语和笔试一般不在同一天, 有时候可能会差一个…

工业三废数据集(工业烟粉尘排放量、工业二氧化硫排放量、工业废水排放量)2006-2021年

01、数据介绍 工业三废是指工业生产过程中排出的废气、废水和废渣 工业二氧化硫排放量指企业在燃料燃烧和生产工艺过程中排入大气的二氧化硫数量。 工业烟粉尘排放量是指企业在生产工艺过程中排放的烟尘和粉尘等颗粒物重量。 工业废水排放量是指企业在生产过程中产生的废水…

GEE必须会教程—植被覆盖度(FVC)计算(代码分享)

植被覆盖度(FVC)的计算是遥感上非常重要的一个研究领域,因事务繁忙,今天小编先带来FVC的全文代码,给大家试试,后期会出一期专栏进行代码的详细介绍: 今天福利满满,直接上代码&#…

信息技术内涵及意义

一、信息技术及其演进趋势 (一)信息技术概况概念 信息技术(Information Technology,IT)指“应用在信息加工和处理中的科学、技术与工程的训练方法与管理技巧;上述方法和技巧的应用;计算机及其…

【氮化镓】GaN器件在航天器高可靠正向转换器中应用

文章是发表在《IEEE Journal of Emerging and Selected Topics in Power Electronics》2022年10月第10卷第5期上的一篇关于GaN(氮化镓)器件在航天器高可靠性正向转换器中应用的研究。文章的作者是匹兹堡大学电气与计算机工程系的Aidan Phillips, Thomas Cook和Brandon M. Gra…

【C语言视角】数据结构之~二叉树

前言:总所周知~数据结构的二叉树对于初学者来说是一个十分难理解的知识点。接下来,请阅读本人对二叉树拙劣的理解~ 目录 1.二叉树概念及结构 和性质 二叉树的结构 二叉树的存储结构 2.二叉树顺序结构 3.二叉树链式结构的实现 二叉树层序遍历 1.二叉树…

Flask路由的使用

Flask 是一个轻量级的 Python Web 框架,其简洁的设计使得构建 Web 应用变得轻而易举。其中,路由是 Flask 中至关重要的一部分,它定义了 URL 与视图函数之间的映射关系,决定了用户请求的处理方式。在本文中,我们将深入探…

服务运营 | 精选:用药难?用药贵?运筹学与统计学视角下的药物研发与管理

作者设计了一个多阶段博弈论模型来针对罕见病的不同补贴方案,分析政府、联盟、制药商和患者之间的相互作用。 制药商补贴为 α C \alpha C αC,其中 C C C是研发成本, α ∈ [ 0 , 1 ) \alpha \in [0,1) α∈[0,1)是政府总成本的比例。患者补…

ASP.NET淘宝店主交易管理系统的设计与实现

摘 要 淘宝店主交易管理系统主要采用了ASPACCESS的B/S设计模式,通过网络之间的数据交换来实现客户、商品、交易的管理和对客户、商品、交易统计工作,从而提高淘宝店主在管理网店过程中的工作效率和质量。 系统分为基本资料模块,统计资料模…

系统调用 int 86 的过程

该图借鉴与 Linux系统调用全过程详解-高性能服务器开发,向作者致敬。

Vue 之 在当前页面的实现分页效果

目录 场景实现 场景 假设,我们现在有这么一个需求: 上述图片的空白内容是活动的,由下面的两个按钮控制上一页、下一页;我们应该可以怎么去实现? 实现 思路: 其实这个问题,我们仿照其他的UI框…

关于远程桌面与3389端口的深度解析

当我们谈论远程桌面和3389端口时,我们实际上是在探讨Windows操作系统的一个核心功能,该功能允许用户通过网络从任何地点远程控制和管理计算机。而3389端口,正是这一功能所依赖的通信端口。 一、远程桌面的工作原理 远程桌面协议(R…

AppWeb 身份验证绕过漏洞 (CVE-2018-8715)

一、docker的相关操作(默认安装了docker-compose) 在相应的文件夹位置打开终端后进行如下操作 运行此靶场 sudo docker-compose up -d 查看启动环境 sudo docker ps 关闭此靶场环境 sudo docker-compose down 二、漏洞描述 AppWeb 是一个嵌入式 Web 服…

数组克隆/复制

数组的复制/克隆 1.浅克隆2.深克隆3.使用System.ArrayCopy()方法4.使用Arrays.copyOf()方法5.使用Arrays.copyOfRange()方法6.使用Object.clone()方法 1.浅克隆 将原来数组的地址赋值给新数组,两个数组名指向了同一个数组,修改其中一个中的元素&#xff…