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}
链表添加过程图解
pevent1++; 指向pevent2;
pevent2++; 指向下一个事件
最后 OSEventFreeList = &OSEventTbl[0]; 将任务链表赋给OSEventFreeList 指针。