版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、优先级反转问题以及解决方式优先级反转的问题是每一个实时操作系统所必须考虑到的问题,也是嵌入式软件面试所常提问的问题。下面会详细阐述优先级反转产生的根源,以及解决方式。首先来谈谈优先级反转问题的出现的方式。下图是演示优先级反转出现的问题。假设有3个任务task1 优先级最高,task2优先级其次,task3优先级最低。假设task1 ,task2 分别阻塞在内核对象上比如queue等,然后轮到task3去运行,首先task3 获得了一个semaphore锁,然后运行了一段时间后,中断唤醒了task1,出中断的时候马上跑task1, 因为task1 的优先级高,然后task1也尝试去获得semap
2、hore锁,但是task3 已经得到了这个锁,所以task1 只能睡眠,轮到task3 继续跑,这个时候中断唤醒了task2,出中断的时候轮到task2去跑,因为task2的优先级比task1要高。task2 运行完了然后给task3 跑,task3 跑完了才轮到task1去跑。以上的现象就是一个完整的优先级反转的问题出现的现象,整个逻辑貌似都是完全没有任何问题的,唯一的问题就是task2跑完了再去跑task1,也就是说task2插了一脚。 task2 的优先级比起task1 要低的,这样的话task1 要同时承受task2 和task3 跑完才能继续跑。承受task3 跑完是没有任何争议的,
3、因为临界区的原因,task1只能等task3跑完,但是task1等待task2 跑完确是不应该的,因为这两个任务之间毫无关系。解决优先级反转的方式有两种,第一种是优先级置顶的方法,第二种是优先级继承的方法,详细请参考以下mutex章节。Mutex工作原理以及应用mutex 的出现是为了解决优先级反转的问题,由于优先级反转对实时性影响太大,所以mutex 的稳定性直接影响了实时性。纵观目前多种实时操作系统mutex 的设计原理是多多少少有一点问题的,很多rtos没有实现mutex优先级逐步还原的问题,导致了实时性以及其它的一些逻辑错误等等。raw os 的mutex 模块成功弥补了其它实时系统在
4、这方面的不足。Raw os 的mutex 同时支持优先级置顶和优先级继承的方式来解决优先级反转的问题。优先级置顶方法需要给每一个mutex 静态指定一个优先级,第一个获得mutex 的任务会把优先级提高到静态指定的优先级。优先级置顶的方法需要把竞争这个mutex 的所有任务优先级都要搞清楚,通常适用于系统中运行的任务优先级不改变的情况。如果一个任务会获得多层嵌套的mutex锁,这个时候使用优先级继承的方法设计不好的话容易死锁,但是使用优先级置顶的方法能够避免此种情况出现。下图是任务t3获得mutx1的情况,示例如下:假设访问mutex1 的任务有t1, t2, t3, t1 的优先级为20,
5、t2 的优先级为25, t3 优先级为 30,数字越小表明优先级越高。这个时候mutex1 指定的优先级置顶的优先级是19, 即比t1, t2 的优先级要高。假设任务t3的首先获得mutex1,这个时候任务t3的优先级会提升为19,所以t3会运行完之后释放锁轮到t1运行综上所述,优先级置顶的话需要事先静态分析清楚,的确是比较麻烦的,好处是系统可以一目了然,不存在暗箱,做到系统每一个点都是很清楚。再来谈谈优先级继承的方法, 所谓优先级继承的含义是,当优先级反转发生的时候,低优先级任务的优先级被自动提升为高优先任务的优先级, 示例如下:假设任务t3 的优先级为30, t2优先级为25,t1优先级为
6、20。因为数字越小优先级越高,所以t1优先级大于t2,t2优先级大于t3。假设t1和t2处于休眠状态, t3 会运行首先获得了锁, 然后在一个时间点高优先级任务t1被唤醒 ,抢占了t3, 然后t1 也尝试去获得锁,因为t3 已经获得了锁,所以t1只能睡眠,就在此时,任务t3的优先级被任务t1 拉升为20。任务t3会接着继续运行,如果此时t2被唤醒,因为优先级低于t3,所以不会抢占t3,所以t3会继续运行直到释放锁,然后t3的优先级会被还原到最初值,接着轮到最高优先级任务t1运行。整个过程的关键是中间优先级的任务t2不会打断t3,也就避免了优先级反转的问题。优先级反转的问题掌握着实时系统的命脉,
7、这个问题上处理的不当得话,用户的系统实时性是得不到任何保障的,纵观目前的RTOS 在mutex 这个问题上很多都是处理的不当的,具体以下分析代码会细谈这个问题。Mutex api 应用1 RAW_U16 raw_mutex_create(RAW_MUTEX *mutex_ptr, RAW_U8 *name_ptr, RAW_U8 policy, RAW_U8 ceiling_prio) 函数功能:此函数创建了一个mutex.此函数的参数有4个,分别含义如下: mutex_ptr 为RAW_MUTEX 实体控制块的地址。name_ptr 是这个mutex 的名字policy 是指以下的三种之一:
8、1 RAW_MUTEX_CEILING_POLICY指定mutex 采用优先级置顶的方法。2 RAW_MUTEX_INHERIT_POLICY指定mutex 采用优先级继承的方法。3 RAW_MUTEX_NONE_POLICY不采用任何方法。如果policy 采用了RAW_MUTEX_INHERIT_POLICY 的话, ceiling_prio可以为任何RAW_U8 的值。函数的返回值:RAW_SUCCESS示例代码如下:RAW_MUTEX mutext1;raw_mutex_create(&mutext1,(RAW_U8 *)"mutex1", RAW_MUTE
9、X_INHERIT_POLICY, 0);2 RAW_U16 raw_mutex_get(RAW_MUTEX *mutex_ptr, RAW_U32 wait_option)函数功能:此函数会试图得到一个mutex 锁。如果不能成功获得锁的话,任务可能会睡眠或者返回。此函数的参数有2个,分别含义如下:mutex_ptr 为RAW_MUTEX 实体控制块的地址。wait_option 为具体的超时函数,有以下选择:RAW_NO_WAIT 得不到mutex 立马返回0x1-0xfffffffe 为超时时间,单位为系统tick,得不到mutex时经过一定的超时时间会返回。RAW_WAIT_FOREV
10、ER 得不到mutex 时会永远阻塞住。函数的返回值:RAW_SUCCESS 成功得到mutex.RAW_NO_PEND_WAIT 得不到mutex 而且wait_option为RAW_NO_WAITRAW_SCHED_DISABLE 得不到mutex, 而且系统的抢占关了。RAW_BLOCK_ABORT 得不到mutex 期间,睡眠的时候被异常中断。RAW_BLOCK_TIMEOUT得不到mutex 期间超时了。RAW_BLOCK_DEL 得不到mutex 期间,该mutex 对象被意外删除掉。3 RAW_U16 raw_mutex_put(RAW_MUTEX *mutex_ptr)函数功能
11、:释放一个mutex.此函数的参数有1个,含义如下:mutex_ptr 为RAW_MUTEX 实体控制块的地址。函数的返回值:RAW_MUTEX_NOT_RELEASE_BY_OCCYPY: Mutex 没有让原先持有者释放。RAW_SUCCESS: 成功释放mutex.4 RAW_U16 raw_mutex_delete(RAW_MUTEX *mtxcb)函数功能:删除一个mutex, 如果有任务阻塞在mutex ,会唤醒这些任务并可能还原锁获得者原先的优先级。Mutex 系统内部api1 RAW_U8 chg_pri_mutex(RAW_TASK_OBJ *tcb, RAW_U8 prio
12、rity, RAW_U16 *error)函数功能:改变一个任务优先级的时候会调用到此函数。这个函数主要限制任务优先级的改变,因为当一个任务持有mutex 的时候,优先级是不能被随意设置成任何值的,不然会导致优先级反转的问题出现。所以必须要有限制的改变。当然一个任务释放了所有mutex 锁的时候,优先级会自动变为所设置的优先级。函数的返回值:RAW_EXCEED_CEILING_PRIORITY:优先级超越了该mutex 对象优先级置顶的优先级 。hi_pri:被限制过的优先级。此函数的参数有3个,分别含义如下: tcb: 被改变优先级的任务的控制块地址。priority:改变成具体的优先级。
13、error: 错误填充,如果可能的话。2 static RAW_VOID release_mutex(RAW_TASK_OBJ *tcb, RAW_MUTEX *relmtxcb)函数功能:此函数的功能是释放mutex, 并可能逐步还原tcb 这个任务的优先级。此函数的参数有2个,分别含义如下:tcb:为释放mutex 的任务relmtxcb:为释放的mutex对象。3 RAW_VOID mtx_chg_pri(RAW_TASK_OBJ *tcb, RAW_U8 oldpri)函数功能:如果改变阻塞在mutex上的任务的优先级时会调用此函数,可能会动态的改变下mutex 持有者的任务优先级。M
14、utex 模块的具体实现原理配套视频会详细讲解,有兴趣深入的读者可以看视频了解。4 RAW_VOID mutex_state_change(RAW_TASK_OBJ *tcb)函数功能:当阻塞在mutex 上的任务超时,终止,或者被删除的时候,可能需要重新调整获得这个mutex 锁的任务优先级。此函数的参数有1个,含义如下:tcb: 为阻塞在内核对象上的任务。5 RAW_VOID raw_task_free_mutex(RAW_TASK_OBJ *tcb)函数功能:当任务被删除时,会调用此函数。此函数会处理这个任务所获得的mutex, 并自动调整锁的获得者。此函数的参数有1个,含义如下:tcb:为即将被删除的任务。Mutex对比其它实时操作系统raw os 的mutex 比较其它实时系统,比如ucos, ecos, freertos 等占尽了优势,因为当一个任务经历两次以上的优先级提升时,其它系统
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 道路养护工程承包合同三篇
- 智能家居工程师的设计理念与技术要求
- 初三班主任期中工作总结耐心教导成功引领
- 垃圾处理站保安工作总结
- 汽车行业的美工工作总结
- 《汽车及配件营销》课件
- 《美容新术课件》课件
- 2023年四川省阿坝自治州公开招聘警务辅助人员辅警笔试自考题1卷含答案
- 2023年广东省湛江市公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 2021年贵州省黔东南自治州公开招聘警务辅助人员辅警笔试自考题2卷含答案
- 35KV变电站地质勘察与施工方案
- 2024年中学科技教育工作总结样本(4篇)
- 2025年中国社会科学院外国文学研究所专业技术人员招聘3人历年管理单位笔试遴选500模拟题附带答案详解
- 国家开放大学电大本科《理工英语3》期末试题题库及答案1(试卷号:1377)
- 湖北省十堰市2023-2024学年高二上学期期末调研考试 物理 含答案
- 2024-2025学年广东省第一次普通高中学业水平合格性考试物理仿真模拟卷三及答案
- 《现代控制理论》全套课件(东北大学)
- 专题21一次函数(原卷版+解析)
- 期末 (试题) -2024-2025学年人教PEP版英语六年级上册
- 山东师范大学《计算机网络》期末考试复习题及参考答案
- 螺杆式制冷压缩机操作规程完整
评论
0/150
提交评论