原创 OSSemPend和OSSemPost

2010-7-6 10:38 3634 6 6 分类: MCU/ 嵌入式
typedef struct {
    INT8U   OSEventType;                   /* Type of event control block (see OS_EVENT_TYPE_???)      */
    INT8U   OSEventGrp;                    /* Group corresponding to tasks waiting for event to occur  */
    INT16U  OSEventCnt;                    /* Semaphore Count (not used if other EVENT type)           */
    void   *OSEventPtr;                    /* Pointer to message or queue structure                    */
    INT8U   OSEventTbl[OS_EVENT_TBL_SIZE]; /* List of tasks waiting for event to occur                 */
} OS_EVENT;

主要看的是OSEventCnt,这个是资源数目,创建的时候使用OSSemCreate (INT16U cnt)把cnt传递给它。
当需要使用这个资源的时候,需要先调用OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
如果资源数目大于0,申请资源成功,资源数目减1,然后返回
如果资源数目等于0,则要等待,timeout定义了超时时间,如果等待的周期数小于timeout,则返回继续执行,否则err = OS_TIMEOUT
在检测到资源数目等于0进行等待的时候会进行任务切换OS_Sched();

还有一个函数是OSSemPost (OS_EVENT *pevent),这个函数是释放资源,执行后资源数目会加1


在使用某个信号量之前需要创建它,创建时候唯一的参数就是资源的数目,如果是一块缓冲区,这个数目应该是缓冲区的大小,如果是比如串口资源,则资源数目应该待于1

所以在调用OSSemPend()时,一定要检测它的返回类型,即err,如果不检测它的话,没有什么意义,这个有几种类型,分别是
OS_ERR_PEND_ISR      
OS_ERR_PEVENT_NULL   没有创建该信号量
OS_ERR_EVENT_TYPE    OSEventType类型不匹配
OS_NO_ERR            成功
OS_TIMEOUT           超时

如果你直接使用的话,应该会返回第二种。

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /2 下一条