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为删除的选择项:立即删除、等待无任务等待时再删除。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?