ucos-II 任务间同步源码分析(二)

事件标志组也是任务同步的一种机制,它实现的同步机制是针对多个条件,因此类似Event但引入了一个flag变量,假设这个flag是个INT8U,那么其0x00010010每个bit位的1或者0表示一个条件的满足或不满足。

事件标志组管理的全局变量(下述变量在OS_FlagInit中初始化):

typedef struct {/* Event Flag Group                                        */
    INT8U         OSFlagType;/* Should be set to OS_EVENT_TYPE_FLAG */
    void         *OSFlagWaitList;/* Pointer to first NODE of task waiting on event flag     */
    OS_FLAGS      OSFlagFlags;/* 8, 16 or 32 bit flags                                  */
} OS_FLAG_GRP;  
OS_EXT  OS_FLAG_GRP       OSFlagTbl[OS_MAX_FLAGS];  /* Table containing event flag groups  */
OS_EXT  OS_FLAG_GRP      *OSFlagFreeList;  /* Pointer to free list of event flag groups */

在每个任务的os_tcb结构体中由成员:

OS_FLAG_NODE  *OSTCBFlagNode; /* Pointer to event flag node */
复制代码
typedef struct { /* Event Flag Wait List Node                                   */
    void         *OSFlagNodeNext;  /* Pointer to next     NODE in wait list     */
    void         *OSFlagNodePrev;  /* Pointer to previous NODE in wait list     */
    void         *OSFlagNodeTCB;  /* Pointer to TCB of waiting task             */  
    void         *OSFlagNodeFlagGrp; /* Pointer to Event Flag Group             */  
    OS_FLAGS      OSFlagNodeFlags; /* Event flag to wait on                     */  
    INT8U         OSFlagNodeWaitType;  /* Type of wait:                                           */
                                            /* OS_FLAG_WAIT_AND                                   */
                                            /* OS_FLAG_WAIT_ALL                                   */
                                            /* OS_FLAG_WAIT_OR                                    */
                                            /* OS_FLAG_WAIT_ANY                                   */
} OS_FLAG_NODE;
复制代码

事件标志组管理的主要函数分析:

  1. 建立一个事件标志组 OSFlagCreate:初始化一个OS_FLAG_GRP资源,存储一个flag的初始值至OSFlagFlags成员;
  2. 等待事件组的事件标志位 OS_FLAGS  OSFlagPend (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U wait_type, INT16U timeout, INT8U *err) ,函数处理如下:
    1. 参数wait_type表示等待flag的类型,包括OS_FLAG_WAIT_CLR_ALL(等待所有的标志清0),OS_FLAG_WAIT_CLR_ANY(等待任一标志位清0),OS_FLAG_WAIT_SET_ALL(等待所有标志位置1),OS_FLAG_WAIT_SET_ANY(等待任一标志置1)。当选择方式为“任一”时,参数flags指示该位。
    2. 根据wait_type比较OSFlagFlags的值,如果满足条件则返回;
    3. 否则,调用函数OS_FlagBlock,该函数中将当前任务的状态置位为OS_STAT_FLAG,并且将自己添加在事件标志组的等待队列中;
  3. 置位或清0一个标志组中的标志位 OS_FLAGS  OSFlagPost (OS_FLAG_GRP *pgrp, OS_FLAGS flags, INT8U opt, INT8U *err),函数处理如下:
    1. 根据入参opt和flags重新对pgrp->OSFlagFlags进行置位;
    2. 遍历pgrp->OSFlagWaitList,查找事件标志组的等待任务,判断此时是否有任务满足标志位要求;
    3. 若有满足,调用OS_FlagTaskRdy,将该任务由OS_STAT_FLAG状态改为OS_STAT_RDY,从等待队列中删除该任务;
    4. 调用OS_Sched(),触发重新调度;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @   Fredric_2013  阅读(679)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示