原创 两个任务通过信号量实现合作

2011-9-23 15:52 1553 10 10 分类: 工程师职场

新建信号量

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条评论)

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