第二章 第5节 OS的信号量原理 闫刚


信号量是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函数

  1.  信号量的创建
   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,他是在等待信号量。


猜你喜欢

转载自blog.csdn.net/yangang185/article/details/80917001