新建信号量
OSEvent *temp;
定义初值为0的信号量
temp = OSSemCreate(0);
在Task1中,请求信号量
OSSemPend(tem,0,&err);
在Task2中,设定条件下发送信号量
OSSemPost(temp);
这样就可以实现两个任务的合作。
----------------函数说明-------------
OSSemPend (OS_EVENT *pevent, INT16U timeout, INT8U *err)
{
一系列判断是否合法
OS_ENTER_CRITICAL();
if (pevent->OSEventCnt > 0) { /* If sem. is positive, resource available ... */
pevent->OSEventCnt--; /* ... decrement semaphore only if positive. */
OS_EXIT_CRITICAL();
&nbbsp; return;
}
OS_EventTaskWait(pevent); /* Suspend task until event or timeout occurs */
OS_EXIT_CRITICAL();
OS_Sched(); ----------任务调度
如果等待时间到,调用
OS_EventTO(pevent);
}
OS_EventTaskWait(pevent)
{
OSRdyTbl----------就绪标志清零
pevent->OSEventTbl--------------等待事件标志置一
}
OSSemPost (OS_EVENT *pevent)
{
判断
OS_ENTER_CRITICAL();
if (pevent->OSEventGrp != 0x00) { /* See if any task waiting for semaphore*/
(void)OS_EventTaskRdy(pevent, (void *)0, OS_STAT_SEM); /* Ready HPT waiting on event */
OS_EXIT_CRITICAL();
OS_Sched(); /* Find HPT ready to run */
return (OS_NO_ERR);
}
}
OS_EventTaskRdy()
{
清除 OSEventTbl
清除ptcb的等待标志
任务就绪
if (ptcb->OSTCBStat == OS_STAT_RDY) { /* See if task is ready (could be susp'd) */
OSRdyGrp |= bity; /* Put task in the ready to run list */
OSRdyTbl[y] |= bitx;
}
}
文章评论(0条评论)
登录后参与讨论