博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UCOS II 事件初始化 OS_InitEventList 源码分析
阅读量:7077 次
发布时间:2019-06-28

本文共 2479 字,大约阅读时间需要 8 分钟。

hot3.png

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}

链表添加过程图解

174143_Fus5_274829.png

pevent1++; 指向pevent2;

pevent2++; 指向下一个事件

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

转载于:https://my.oschina.net/u/274829/blog/278819

你可能感兴趣的文章