UCOS-信号量(学习笔记)
当事件控制块类型为OS_Event_Type_SEM类型时就是信号量,包含2个内容:信号量计数器OSEventcnt和等待列表OSEventTbl[].
一创建信号量:OSSemCreat(int16u cnt);其参数表明信号量计数器的初值。该函数创建后等待列表都为0(即没有等待任务),因为等该信号量的任务有的一开始就要执行此时cnt=1;若该任务一开始不能获得运行则cnt=0;当多任务都等待该信号量时则可能cnt初值会大于1;
二等待(请求)信号量:OSSemPend(os_enent *p ,timeout,&err);//当有任务请求时且此时OSEventcnt>0,则减一后式任务运行,若OSEventcnt=0则将该任务存入等待列表指定位置;若其它任务等释放(发送)了该信号量,则会从该信号量的等待列表中找出最好优先级的任务使其运行,如果此时没有等待任务则简单加1.
OSSemAccept(OS_EVENT *p)//当等待的信号无效时无需等待直接运行。
三发送信号量:INT8U OSSemPost(OS_EVENT *p)//成功则返回OS_NO_ERR
四删除信号量:不用时可删除:OS_EVENT *OSSemDel(OS_EVENT *p,opt,&err)//opt选型有2个值:强制删除和等没有任务等待改信号量时才删除。
五查询信号量状态:INT8U OSSemQuery(OS_EVENT *p,OS_SEM_DATA*pdata)//将查询的结果存在第二个变量中