您的位置:首页 > 其它

uc/os-ii信号量集

2015-07-04 10:00 323 查看
在实际应用中,任务常常需要与多个事件同步,即要根据多个信号量组合作用的结果来决定任务的运行方式。μC/OS-II为了实现多个信号量组合的功能定义了一种特殊的数据结构——信号量集。

信号量集所能管理的信号量都是一些二值信号,所有信号量集实质上是一种可以对多个输入的逻辑信号进行基本逻辑运算的组合逻辑,其输入为其他任务发出的多个信号,而输出为多个输入逻辑运算的结果。

uC/OS-II把信号量集的功能分成两部分:标志组和等待任务链表。这里的标志组+等待任务链表可以理解为之前讲的事件控制块。事件待列表中用全0表示没有等待事件的任务,标志组中的OSFlagWaitList = (void *)0;表示没有等待信号量集的任务。

标志组。

typedef struct os_flag_grp {                /* 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                                   */
#if OS_FLAG_NAME_SIZE > 1
INT8U         OSFlagName[OS_FLAG_NAME_SIZE];
#endif
} OS_FLAG_GRP;


等待任务链表由等待任务控制块
OS_FLAG_NODE
链接的双向链表构成。

typedef struct os_flag_node {               /* 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;


信号量集的操作与其他事件累死,不再详细分析。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: