UCOS-互斥信号量(学习笔记)

互斥信号量主要是为了解决信号量出现的优先级反转的情况:任务的运行取决于优先级和获得信号量2个条件,并且获得信号量又优先于设定的优先级。剥夺性内核对信号量进行独占访问,就有可能出现先获得信号量的低优先级任务在独占信号量过程中被高优先级任务剥夺CPU控制权而挂起,不能及时释放信号量,而高优先级任务又需要该信号量从而出现优先级反转。

解决的办法:引入互斥信号量,在任务获得共享信号量过程中提升置最高优先级不被打断(通过将信号量计数器分成高8位作为提升优先级,低8位作为占用标志0XFF表明未占用),从而使低优先级任务及时释放共享信号量。其它与信号量相同。

一创建互斥信号量: OS_EVENT *OSMutexCreat(INT8U prio,INT8U &err)//从任务链表中取得一个任务控制块赋值类型为OS_Event_TYPE_MUXTEX,然后给任务计数器的高8位赋值优先级,第八位赋值0XFF表明未被占用。

二申请互斥信号量:void OSMutexPend(OS_EVENT *P, INT16U timeout,INT8U &err)//访问任务计数器若为0xff则获得运行权,否则进入等待列表,timeout用于指定等待时间。

OSMutexAccept(OS_EVENT *P,INT8U &err)//无等待的请求一个信号量。

三发送(释放)互斥信号量:INT8U OSMutexPost(OS_EVENT *P)

四获得互斥型信号量的当前状态:INT8U OSMutexQuery(OS_EVENT *P,OS_MUTEX_DATA *pdata)//需事先定义一个存储互斥型信号量状态的变量。

五删除互斥型信号量:OS_EVENT *OSMutexDel(OS_EVENT *P, INT8U opt,INT8U &err)//opt为删除的选择项:立即删除、等待无任务等待时再删除。

原文地址:https://www.cnblogs.com/jieruishu/p/4431907.html