信号量是os非常重要的机制。
uc/os-ii的信号量是由两个部分组成:一部分是16位的无符号整型信号量的计数值(0~65535);另一部分是等待该信号量的任务组成的等待任务表。
1. 数据段
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) */
OS_PRIO OSEventGrp; /* Group corresponding to tasks waiting for event to occur */
OS_PRIO OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur */
#if OS_EVENT_NAME_EN > 0u
INT8U *OSEventName;
#endif
} OS_EVENT;
OS_EXT OS_EVENT *OSEventFreeList;
2. 信号量API函数
- 信号量的创建
OS_EVENT *OSSemCreate (INT16U cnt)
->pevent->OSEventType = OS_EVENT_TYPE_SEM;
2. 发出信号量
INT8U OSSemPost (OS_EVENT *pevent)
OSTCBCur->OSTCBStat |= OS_STAT_SEM;
->(void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM, OS_STAT_PEND_OK);
-》OS_Sched();
3. 等待信号量
void OSSemPend (OS_EVENT *pevent,
-> OSTCBCur->OSTCBStat |= OS_STAT_SEM;
-> OS_Sched();
从ucosii的信号量,我们可以了解到,1个信号量的机制,其实,就是操作一个全局变量OS_EVETNT的结构体的变量,从上面3个最常用的API来看, 信号量的创建和信号量的发出是和线程没有关系的, 仅仅等待信号量的线程,需要告知OS,他是在等待信号量。