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

news2024/11/23 4:49:44

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

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

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

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

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

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

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

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

  • 六十八、UCOSIII:常用的结构体(os.h文件)第二部分
    • OS_MEM
    • OS_MSG
    • OS_MSG_POOL
    • OS_MSG_Q
    • OS_MUTEX
    • OS_INT_Q
    • OS_Q

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

OS_MEM

typedef struct os_mem OS_MEM;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                   MEMORY PARTITIONS
------------------------------------------------------------------------------------------------------------------------
*/


struct os_mem {                                             /* MEMORY CONTROL BLOCK                                   */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_MEM                       */
    void                *AddrPtr;                           /* Pointer to beginning of memory partition               */
    CPU_CHAR            *NamePtr;
    void                *FreeListPtr;                       /* Pointer to list of free memory blocks                  */
    OS_MEM_SIZE          BlkSize;                           /* Size (in bytes) of each block of memory                */
    OS_MEM_QTY           NbrMax;                            /* Total number of blocks in this partition               */
    OS_MEM_QTY           NbrFree;                           /* Number of memory blocks remaining in this partition    */
#if OS_CFG_DBG_EN > 0u
    OS_MEM              *DbgPrevPtr;
    OS_MEM              *DbgNextPtr;
#endif
};

这个结构体定义描述了一个内存分区(Memory Partition)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,应设置为 OS_OBJ_TYPE_MEM,表示这是一个内存分区对象。
  2. AddrPtr: 指向内存分区起始地址的指针,指向内存分区中第一个可用内存块的地址。
  3. NamePtr: 指向内存分区名称的指针,通常是一个以NUL终止的ASCII字符串。
  4. FreeListPtr: 指向空闲内存块链表的指针,用于存储内存分区中未分配的内存块。
  5. BlkSize: 内存块大小,表示每个内存块的字节数。
  6. NbrMax: 内存分区中总共可用的内存块数量。
  7. NbrFree: 内存分区中当前可用的空闲内存块数量。
  8. DbgPrevPtrDbgNextPtr: 调试目的的前一个和后一个内存分区指针,用于链表连接。

在这里插入图片描述

内存分区是一种动态内存分配的管理机制,它将一块大的连续内存空间分割成多个固定大小的内存块,并维护一个空闲内存块链表。应用程序可以通过内存分区来分配和释放内存块,以满足动态内存需求。这个结构体包含了内存分区的属性,例如名称、起始地址、内存块大小和数量等,以及用于调试的指针。

OS_MSG

typedef struct os_msg OS_MSG;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                       MESSAGES
------------------------------------------------------------------------------------------------------------------------
*/

struct  os_msg {                                            /* MESSAGE CONTROL BLOCK                                  */
    OS_MSG              *NextPtr;                           /* Pointer to next message                                */
    void                *MsgPtr;                            /* Actual message                                         */
    OS_MSG_SIZE          MsgSize;                           /* Size of the message (in # bytes)                       */
    CPU_TS               MsgTS;                             /* Time stamp of when message was sent                    */
};

这个结构体定义描述了一个消息(Message)的控制块。下面是结构体中各个字段的详细解释:

  1. NextPtr: 指向下一个消息控制块的指针,用于链接消息队列中的消息。
  2. MsgPtr: 指向实际消息数据的指针,存储了消息的内容。
  3. MsgSize: 消息的大小,表示消息数据的字节数量。
  4. MsgTS: 消息的时间戳,记录了消息被发送的时间。

在这里插入图片描述

这个结构体用于管理消息队列中的消息。消息队列是一种常用的通信机制,允许任务之间传递数据。每个消息控制块代表了一个消息,包含了消息的内容、大小和发送时间等信息。通常,消息控制块会被链接成一个链表,形成一个消息队列,任务可以通过发送和接收消息来进行通信。
在这里插入图片描述

OS_MSG_POOL

typedef struct os_msg_pool OS_MSG_POOL;

struct  os_msg_pool {                                       /* OS_MSG POOL                                            */
    OS_MSG              *NextPtr;                           /* Pointer to next message                                */
    OS_MSG_QTY           NbrFree;                           /* Number of messages available from this pool            */
    OS_MSG_QTY           NbrUsed;                           /* Current number of messages used                        */
    OS_MSG_QTY           NbrUsedMax;                        /* Peak number of messages used                           */
};

这个结构体定义描述了一个消息池(Message Pool)。下面是结构体中各个字段的详细解释:

  1. NextPtr: 指向下一个消息池的指针,用于链接消息池链表中的不同消息池。
  2. NbrFree: 池中当前可用的消息数量,表示尚未被使用的消息数量。
  3. NbrUsed: 池中当前已使用的消息数量,表示已经被分配给任务的消息数量。
  4. NbrUsedMax: 池中曾经同时被使用的最大消息数量,表示消息池在任何时间点上达到的最大负载。

消息池是一种预先分配的消息存储区域,用于分配和管理消息控制块。它通常由固定数量的消息控制块组成,以满足任务之间的通信需求。消息池的主要目的是提高消息管理的效率和实时性,避免了在消息发送和接收时的动态内存分配和释放操作。通过维护消息池的状态信息,可以有效地跟踪消息的使用情况,帮助系统监视消息的分配和释放情况,从而实现对系统资源的合理管理。

OS_MSG_Q

typedef struct os_msg_q OS_MSG_Q;

struct  os_msg_q {                                          /* OS_MSG_Q                                               */
    OS_MSG              *InPtr;                             /* Pointer to next OS_MSG to be inserted  in   the queue  */
    OS_MSG              *OutPtr;                            /* Pointer to next OS_MSG to be extracted from the queue  */
    OS_MSG_QTY           NbrEntriesSize;                    /* Maximum allowable number of entries in the queue       */
    OS_MSG_QTY           NbrEntries;                        /* Current number of entries in the queue                 */
    OS_MSG_QTY           NbrEntriesMax;                     /* Peak number of entries in the queue                    */
};

这个结构体定义描述了一个消息队列(Message Queue)。下面是结构体中各个字段的详细解释:

  1. InPtr: 指向队列中下一个将要插入的消息的指针,表示队列的尾部。
  2. OutPtr: 指向队列中下一个将要提取的消息的指针,表示队列的头部。
  3. NbrEntriesSize: 队列中允许的最大消息数量,即队列的容量。
  4. NbrEntries: 队列当前的消息数量,表示当前队列中包含的消息数量。
  5. NbrEntriesMax: 队列曾经同时存在的最大消息数量,表示队列在任何时间点上达到的最大负载。

消息队列是一种用于在任务之间进行异步通信的机制,允许任务以先进先出(FIFO)的方式发送和接收消息。通过维护队列的入口指针和出口指针,可以有效地管理消息的插入和提取操作。消息队列通常用于实现任务之间的解耦合,提高系统的可维护性和可扩展性,同时可以避免任务之间直接的数据共享,从而减少了竞态条件和死锁的发生。

OS_MUTEX

typedef struct os_mutex OS_MUTEX;

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

struct  os_mutex {                                          /* Mutual Exclusion Semaphore                             */
                                                            /* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_MUTEX                     */
    CPU_CHAR            *NamePtr;                           /* Pointer to Mutex Name (NUL terminated ASCII)           */
    OS_PEND_LIST         PendList;                          /* List of tasks waiting on mutex                         */
#if OS_CFG_DBG_EN > 0u
    OS_MUTEX            *DbgPrevPtr;
    OS_MUTEX            *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
                                                            /* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_TCB              *OwnerTCBPtr;
    OS_PRIO              OwnerOriginalPrio;
    OS_NESTING_CTR       OwnerNestingCtr;                   /* Mutex is available when the counter is 0               */
    CPU_TS               TS;
};

这个结构体定义描述了一个互斥信号量(Mutual Exclusion Semaphore),通常称为互斥锁(Mutex)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,应设置为 OS_OBJ_TYPE_MUTEX,表示这是一个互斥信号量对象。
  2. NamePtr: 指向互斥信号量名称的指针,通常是一个以NUL终止的ASCII字符串。
  3. PendList: 等待互斥信号量的任务列表,用于存储等待该互斥信号量的任务的信息。
  4. DbgPrevPtrDbgNextPtrDbgNamePtr: 调试目的的前一个和后一个互斥信号量指针以及互斥信号量名称的指针。
  5. OwnerTCBPtr: 指向当前拥有该互斥信号量的任务控制块(TCB)的指针。
  6. OwnerOriginalPrio: 拥有者任务原始优先级,记录拥有该互斥信号量的任务的原始优先级。
  7. OwnerNestingCtr: 拥有者任务的嵌套计数器,用于跟踪任务对互斥锁的嵌套请求。
  8. TS: 互斥信号量的时间戳,记录了最近一次操作的时间。

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

互斥信号量是一种同步原语,用于在多任务环境中保护共享资源免受并发访问的影响。它确保一次只有一个任务能够访问共享资源,其他任务必须等待拥有互斥信号量的任务释放资源后才能访问。通过维护互斥信号量的拥有者信息和等待列表,可以实现对共享资源的有效保护和同步访问。

OS_INT_Q

typedef struct os_int_q OS_INT_Q;

/*
------------------------------------------------------------------------------------------------------------------------
*                                                    ISR POST DATA
------------------------------------------------------------------------------------------------------------------------
*/

#if OS_CFG_ISR_POST_DEFERRED_EN > 0u
struct  os_int_q {
    OS_OBJ_TYPE          Type;                              /* Type of object placed in the circular list             */
    OS_INT_Q            *NextPtr;                           /* Pointer to next OS_INT_Q in  circular list             */
    void                *ObjPtr;                            /* Pointer to object placed in the queue                  */
    void                *MsgPtr;                            /* Pointer to message if posting to a message queue       */
    OS_MSG_SIZE          MsgSize;                           /* Message Size       if posting to a message queue       */
    OS_FLAGS             Flags;                             /* Value of flags if posting to an event flag group       */
    OS_OPT               Opt;                               /* Post Options                                           */
    CPU_TS               TS;                                /* Timestamp                                              */
};
#endif

这个结构体定义描述了用于延迟中断服务程序(ISR)投递的数据(ISR Post Data)。下面是结构体中各个字段的详细解释:

  1. Type: 放置在循环列表中的对象的类型,应设置为相应的对象类型。
  2. NextPtr: 指向循环列表中下一个 os_int_q 结构体的指针,用于链接循环列表的节点。
  3. ObjPtr: 指向要投递的对象的指针,可以是一个消息队列、事件标志组或其他支持的对象。
  4. MsgPtr: 如果投递到消息队列,则指向要投递的消息的指针。
  5. MsgSize: 如果投递到消息队列,则表示要投递的消息的大小。
  6. Flags: 如果投递到事件标志组,则表示要设置的事件标志的值。
  7. Opt: 投递选项,例如指定是否等待、是否强制投递等。
  8. TS: 时间戳,记录了投递操作的时间。

在这里插入图片描述

这个结构体通常用于在中断服务程序中延迟执行某些操作。当在中断服务程序中需要执行的操作不能立即完成时,可以将相关数据填充到这个结构体中,并将其添加到延迟投递队列中。然后,当中断服务程序完成并退出时,操作系统可以在适当的时间点(通常在任务上下文中)检查延迟投递队列,并执行相应的操作。这种延迟投递的机制可以避免在中断上下文中执行耗时的操作,从而提高系统的响应性和可靠性。

OS_Q

typedef struct os_q OS_Q;

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

struct  os_q {                                              /* Message Queue                                          */
                                                            /* ------------------ GENERIC  MEMBERS ------------------ */
    OS_OBJ_TYPE          Type;                              /* Should be set to OS_OBJ_TYPE_Q                         */
    CPU_CHAR            *NamePtr;                           /* Pointer to Message Queue Name (NUL terminated ASCII)   */
    OS_PEND_LIST         PendList;                          /* List of tasks waiting on message queue                 */
#if OS_CFG_DBG_EN > 0u
    OS_Q                *DbgPrevPtr;
    OS_Q                *DbgNextPtr;
    CPU_CHAR            *DbgNamePtr;
#endif
                                                            /* ------------------ SPECIFIC MEMBERS ------------------ */
    OS_MSG_Q             MsgQ;                              /* List of messages                                       */
};

这个结构体定义描述了一个消息队列(Message Queue)。下面是结构体中各个字段的详细解释:

  1. Type: 对象类型,应设置为 OS_OBJ_TYPE_Q,表示这是一个消息队列对象。
  2. NamePtr: 指向消息队列名称的指针,通常是一个以NUL终止的ASCII字符串。
  3. PendList: 等待消息队列的任务列表,用于存储等待从消息队列中获取消息的任务的信息。
  4. DbgPrevPtrDbgNextPtrDbgNamePtr: 调试目的的前一个和后一个消息队列指针以及消息队列名称的指针。
  5. MsgQ: 消息队列中的消息列表,包含了实际的消息数据。

在这里插入图片描述
消息队列创建完成的示意图具体见图
在这里插入图片描述

消息队列是一种在多任务系统中用于任务间通信的机制。它允许任务以先进先出(FIFO)的顺序发送和接收消息。任务可以通过向消息队列发送消息来通知其他任务,也可以通过从消息队列接收消息来获取其他任务发送的数据。消息队列通常用于解耦合任务之间的依赖关系,允许任务异步地进行通信,提高系统的灵活性和可维护性。
在这里插入图片描述

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

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

相关文章

【JavaEE】线程的概念

文章目录 1、什么是线程2、进程和线程的区别3、多线程的概述4、在Java中实现多线程的方法1.继承Thread类2.实现Runnable接口3.使用匿名内部类来继承Thread类,实现run方法4.使用匿名内部类来实现Runnable接口,实现run方法5.使用 lambda表达式 1、什么是线…

018、Python+fastapi,第一个Python项目走向第18步:ubuntu24.04 安装cuda和pytorch环境

一、说明 我们安装了pytorch环境之后,会用yolo v9 来测试一下,看8g 显存能不能跑下来,上次用无影云电脑,4cpu8g内存直接爆了,云电脑也死机了,提示一直占用内存不释放,我自己的云电脑不能占用内…

基于alpha shapes的边缘点提取(matlab)

1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点。如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动&…

类加载子系统之类的生命周期(待完善)

0、前言 文中大量图片来源于 B站 黑马程序员 0.1、类加载子系统在 JVM 中的位置 类加载器负责的事情是:加载、链接、解析 0.2、与类的生命周期相关的虚拟机参数 参数描述-XX:TraceClassLoading打印出加载且初始化的类 1、类的生命周期 堆上的变量在分配空间的时…

如何基于nginx搭建https网站

华子目录 使用nginx的http_ssl模块建立加密传输的网站查看配置文件ssl配置文件的主要参数实验:搭建nginxssl加密认证的web服务器 使用nginx的http_ssl模块建立加密传输的网站 查看 [rootserver ~]# nginx -V #查看是否有--with-http_ssl_module模块,如…

2024五一杯:煤矿深部开采冲击地压危险预测 (详细完整思路,已修改)

背景 了解即可 煤炭是中国的主要能源和重要的工业原料。然而,随着开采深度的增加,地应力增大,井下煤岩动力灾害风险越来越大,严重影响着煤矿的安全高效开采。在各类深部煤岩动力灾害事故中,冲击地压已成为威胁中国煤矿…

BigKey的危害

1.2.1、BigKey的危害 网络阻塞 对BigKey执行读请求时,少量的QPS就可能导致带宽使用率被占满,导致Redis实例,乃至所在物理机变慢 数据倾斜 BigKey所在的Redis实例内存使用率远超其他实例,无法使数据分片的内存资源达到均衡 Redis阻…

Vue---router实现路由跳转

Vue—router实现路由跳转 目录 Vue---router实现路由跳转基本使用路由跳转html实现路由跳转JS实现路由跳转 基本使用 所谓路由&#xff0c;就是将一个个组件映射到不同的路由url中 首先要将App内的内容换成router-view // App.vue <template><div id"app"…

商务谈判技巧与口才训练方法(3篇)

商务谈判技巧与口才训练方法&#xff08;3篇&#xff09; 商务谈判技巧与口才训练方法&#xff08;**篇&#xff09;&#xff1a;技巧篇 一、商务谈判技巧 明确目标&#xff1a;在谈判前&#xff0c;明确自己的谈判目标&#xff0c;并设定好底线和期望的谈判结果。 知己知彼…

AIGC技术:现状剖析与未来趋势展望

AIGC技术&#xff1a;现状剖析与未来趋势展望 随着科技的飞速进步&#xff0c;人工智能已经逐渐渗透到我们生活的方方面面。其中&#xff0c;AIGC&#xff08;人工智能生成内容&#xff09;技术更是以其独特的魅力和巨大的潜力&#xff0c;引起了业界的广泛关注。本文将深入探…

vue处理查询框清除后无法查询问题,举例为日期选择

例如 在对应的查询方法添加 //我这里获取的是date&#xff0c;如果是其他参数改为其他的即可 if (query.date && query.date.length > 2) {conditions.noedate query.date[0] || conditions.noedate;//获取开始时间conditions.twodate query.date[1] || conditi…

IDEA 开发找到 java-web 发布到 tomcat 的路径

使用 IDEA 开发 java web 应用&#xff0c;有没有遇到需要找到 tomcat 路径的问题 为什么要找 tomcat 路径呢&#xff1f; 拿我的项目来举例&#xff0c;有统一的线上线下 logback.xml 配置&#xff0c;配置时业务、框架日志输出到 file&#xff0c;少量的启动日志输出到 con…

Java进阶-Java Stream API详解与使用

本文全面介绍了 Java Stream API 的概念、功能以及如何在 Java 中有效地使用它进行集合和数据流的处理。通过详细解释和示例&#xff0c;文章展示了 Java Stream API 在简化代码、提高效率以及支持函数式编程方面的优势。文中还比较了 Java Stream API 与其他集合处理库的异同&…

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测

分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测 目录 分类预测 | MATLAB实现LSSVM最小二乘支持向量机多分类预测分类效果基本介绍程序设计参考资料分类效果 基本介绍 MATLAB实现LSSVM最小二乘支持向量机多分类预测。最小二乘支持向量机(Least Squares Support Vecto…

数据结构学习/复习1--时间复杂度计算/异或的几个实际用途

一、什么是数据结构和算法 1注&#xff1a;在内存中的存储管理数据 2注&#xff1a;解决问题的方法 二、时间复杂度 1.算法的效率 2.时间复杂度的概念 计算时间复杂度案例1&#xff1a; 计算时间复杂度案例2&#xff1a; 计算时间复杂度案例3&#xff1a; 计算…

如何将本地Android studio项目上传到GitHub

操作步骤&#xff1a; 1、在GitHub上创建账户 2、在androd studio中添加上述创建的GitHub账号 3、在android studio上找到"share project on GitHub"&#xff0c;点击此选项上传当前项目到GitHub 上传成功后&#xff0c;会在GitHub上创建默认仓库repository 注&a…

【R语言数据分析】基本运算与数据导入速查

R语言中命名可以包含英文字母&#xff0c;下划线&#xff0c;数字&#xff0c;点&#xff0c;下划线和数字不能作为名字的开头&#xff0c;点可以开头&#xff0c;但是点开头后面不能跟数字。一般的命名就是只使用英文和下划线就够了。 四则运算 R语言的除法是即使给的两个数…

常用算法代码模板 (2) :数据结构

AcWing算法基础课笔记与常用算法模板 (2) ——数据结构 常用算法代码模板 (1) &#xff1a;基础算法 常用算法代码模板 (2) &#xff1a;数据结构 常用算法代码模板 (3) &#xff1a;搜索与图论 常用算法代码模板 (4) &#xff1a;数学知识 算法基础课 动态规划模板题笔记 算法…

857.雇佣K名工人的最低成本

题目说的其实是有点乱的,所以我们可能抓不住重点,甚至都不太清楚规则,比如 eg. quality[3,1,10,10,1] wage[4,8,200,200,7] 这里是选下标0,1,4 ->单价为8 但是想清楚其实就很easy. 就是 贪心(sort) 优先队列 梳理下我们发现其实要让每个人得到最低期望,就要按照当前最贵…

项目管理-高级项目管理

1.高级项目管理--主要内容 高级项目管理&#xff0c;以下主要从5方面介绍&#xff1a;项目集管理、项目组合管理、组织级项目管理OPM、量化组织管理、项目管理实践模型。 2.具体内容 2.1项目集管理 项目管理绩效域&#xff1a; 包括项目集战略一致性、项目集效益管理、项目集干…