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条评论)
登录后参与讨论