6.3 使用互斥信号量 当需要访问的共享资源比较复杂,且访问过程比较费时时,关中断、关凋度的措施不可取,它对系统实时性产生了严重影响。如果该共享资源的使用者全部是任务( 即不包含 ISR),可采用互斥信号量的方法来访问。 但使用信号量存在一定风险,可能出现优先级反转现象(优先级反转是指一个低优先级的任务持有一个高优先级任务所需要的共享资源,高优先任务必须等到低优先级任务释放资源才能访问。如果此时有个优先级处于两者之间的任务,并且不需要那个共享资源,则该中优先级的任务实际运行效果优先级最高。如果高优先级任务等待资源时不是阻塞等待,而是循环忙检测,则低优先级任务无法执行,一直占用共享资源,造成的后果就是高优先级任务无法获得资源一直处于等待状态,系统进入假死状态)。 解决方案有两种,设置优先级上限,给临界区一个高优先级,进入临界区的任务都将获得这个高优先级,其他试图进入临界区的任务的优先级都低于这个高优先级,也就不存在优先级反转;另一个方案是优先级继承,当一个高优先级任务等待一个低优先级任务持有的资源时,低优先级任务将暂时获得高优先级进程的优先级别,在释放共享资源后,低优先级任务回到原来的优先级别。这块不需要应用程序关注或实现,因为RTOS自带的互斥信号量(mutex)具有处理优先级反转的功能,特别适合对共享资源的互斥访问。 互斥信号量与用于行为同步的二值信号量不同,互斥信号量的初始值为 1(unlock),表示共享资源有效( 尚未被使用),一个任务需要访问某共享资源时,首先获取该共享资源对应的互斥信号量(lock),如果已经被其它任务占用则等待;若获取成功,则说明该共享资源尚未被其他任务占用,就可以对该共享资源进行使用,使用结束后必须及时发送互斥信号量,解除对该共享资源的占用,以便供其他任务使用。可以类比于进公厕,必须确保门未锁,进入后立刻锁门,事毕出来再开锁,其他人才可再进入使用。 使用互斥信号量访问共享资源时,对中断和任务调度没有限制,系统可以正常响应各种异步事件,其他与该共享资源无关的高优先级任务仍然可以及时运行( 即使任务正在运行关键段落代码),因此,使用互斥信号量进行共享资源访问对系统实时性影响最小。 在使用互斥信号量进行资源同步时,任何任务一旦获得共享资源就可以一直使用到不需要为止,其他任务优先级再高也不能夺去使用权。其原因是获得共享资源的任务具有临时的高优先级(优先级继承值),其他需要访问同一个共享资源的任务均达不到这样高的优先级。优先级继承值必须高于所有需要访问这个共享资源的任务的优先级。 需要注意的是,优先级继承值不能与其他任务的优先级相冋,必须使用一个空闲的、高于全部使用该共享资源的任务的优先级值,初始定义优先级时不要将任务的优先级安排得太紧密,中间留些间隔较好。
|