UCOS II 事件初始化 OS_InitEventList 源码分析

ucos ii 中:信号量、邮箱(消息邮箱)、消息队列实现任务之间的通信,这些被统称为“事件”。

// 事件结构体
typedef struct os_event {
    INT8U    OSEventType;     /* Type of event control block (see OS_EVENT_TYPE_xxxx)    */
    void    *OSEventPtr;       /* Pointer to message or queue structure       */
    INT16U   OSEventCnt;        /* Semaphore Count (not used if other EVENT type)     */
#if OS_LOWEST_PRIO <= 63
    INT8U    OSEventGrp;    /* Group corresponding to tasks waiting for event to occur */
    INT8U    OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur */
#else
    INT16U   OSEventGrp;    /* Group corresponding to tasks waiting for event to occur */
    INT16U   OSEventTbl[OS_EVENT_TBL_SIZE];  /* List of tasks waiting for event to occur */
#endif

#if OS_EVENT_NAME_SIZE > 1
    INT8U    OSEventName[OS_EVENT_NAME_SIZE];
#endif
} OS_EVENT;


//事件链表
OS_EXT  OS_EVENT         *OSEventFreeList;         
OS_EXT  OS_EVENT          OSEventTbl[OS_MAX_EVENTS];


static  void  OS_InitEventList (void)
{
#if (OS_EVENT_EN) && (OS_MAX_EVENTS > 0)
#if (OS_MAX_EVENTS > 1)
    INT16U     i;
    OS_EVENT  *pevent1;
    OS_EVENT  *pevent2;

    OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl)); /* Clear the event table    */
    pevent1 = &OSEventTbl[0];
    pevent2 = &OSEventTbl[1];
    for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {   /* Init. list of free EVENT control blocks */
        pevent1->OSEventType    = OS_EVENT_TYPE_UNUSED;
        pevent1->OSEventPtr     = pevent2;
#if OS_EVENT_NAME_SIZE > 1
        pevent1->OSEventName[0] = '?';                      /* Unknown name    */
        pevent1->OSEventName[1] = OS_ASCII_NUL;
#endif
        pevent1++;
        pevent2++;
    }
    pevent1->OSEventType            = OS_EVENT_TYPE_UNUSED;
    pevent1->OSEventPtr             = (OS_EVENT *)0;
#if OS_EVENT_NAME_SIZE > 1
    pevent1->OSEventName[0]         = '?';
    pevent1->OSEventName[1]         = OS_ASCII_NUL;
#endif
    OSEventFreeList                 = &OSEventTbl[0];
#else
    OSEventFreeList                 = &OSEventTbl[0];  /* Only have ONE event control block  */
    OSEventFreeList->OSEventType    = OS_EVENT_TYPE_UNUSED;
    OSEventFreeList->OSEventPtr     = (OS_EVENT *)0;
#if OS_EVENT_NAME_SIZE > 1
    OSEventFreeList->OSEventName[0] = '?';                  /* Unknown name    */
    OSEventFreeList->OSEventName[1] = OS_ASCII_NUL;
#endif
#endif
#endif
}

链表添加过程图解

UCOS II 事件初始化 OS_InitEventList 源码分析

pevent1++; 指向pevent2;

pevent2++; 指向下一个事件

最后  OSEventFreeList  = &OSEventTbl[0];   将任务链表赋给OSEventFreeList 指针。


你可能感兴趣的:(源码分析,ucos-II,事件初始化)