打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
互斥信号量的优先级翻转(只有更高优先级任务抢占式才进行优先级翻转)
2:互斥信号量mutex
在访问比较耗时的共享资源时,如果采用关中断的方法(系统此时不能被中断、任务不能被切换)来实现访问冲突,这对中断的响应是很不好的,所以这时采用互斥型信号量就可以很好的解决问题,同时可以响应中断。
互斥锁用来实现任务之间的简单同步,一个互斥锁是一个
二元信号量,它的状态只能是0(允许,开锁)和1(禁止,上锁)。
在互斥锁范围内,任何一个任务都可以对互斥负上锁,但只有锁住
该信号的任务才能开锁从而实现了任务同步。
mutex不同于sem,mutex是一个互斥型信号量,它可以通过在应用程序中翻转任务的优先级来解决资源互锁的问题;
举例:首先给一块共享资源配备一个互斥型信号量Mutex,系统中有两个任务A、B,他们的优先级分别为5,6;
假设B先运行,并通过OSMutexPend申请到了Mutex,那么它就会使用该共享资源继续运行,在某个时刻,任务A抢占了任务B,同时也通过OSMutexPend申请Mutex,由于资源已经被B占用,那么OSMutexPend会将B任务的优先级调高到4(假设),这时任务B得意继续运行,资源使用完毕后释放mutex。OSMutexPost注意到原来占有这个mutex的任务的优先级被调高了,于是将B的优先级调低,同时注意到A在申请,于是将mutex给A,做任务切换后A得以执行。
由于互斥型信号量的特性,互斥型信号量只能由于任务中(包括发送功能);
OS_EVENT*ResourceMutex;
ResourceMutex=OSMutexCreate(INT8U prio,&err);//在上述情况中任务可以被调高到prio指定的优先级
OS_EVENT中,pevent->OSEventCnt= (INT16U)((INT16U)prio << 8) |OS_MUTEX_AVAILABLE(0xff);
高八位:PIP;低八位:占用该互斥信号量的任务的优先级(若为0xff表示无任务占用该信号量);
OSMutexPend(ResourceMutex,..,..):在访问共享资源时,先通过该函数获取互斥型信号量,如果互斥型信号量是有效的(没有被占用),则该Mutex的OSEventCnt的低八位为0xff,如果已被占用,则低八位为占用该信号量的任务的优先级;如果占用该信号量的任务的优先级比调用该申请函数的任务的信号量的优先级低,此时低优先级的任务占用共享资源,且已被高优先级的任务抢占了CPU,此时高优先级的任务再调用OSMutexPend申请互斥量,OSMutexPend内部会将占用mutex的低优先级的任务的优先级调高到信号量指定的PIP,这样来让低优先级的任务变为高优先级,尽快释放资源;
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
一步一步教你使用uCOS
鼠眼再看Linux调度器[1]
uC/OS II 学习笔记
浅析μC/OS-ⅡAPI的设计思想及实现机制
VxWorks信号量SEM_FULL/SEM_EMPTY
UCOSIII信号量,互斥信号量
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服