Free RTOS简单排除争夺资源时的死锁

A8 (pp:6215714)2009-8-5 22:28:06
FreeRTOS一般用信号量Semaphore作为任务独占资源的凭证。如果有多个并发的任务共享一个硬件资源,如SPI接口,那么就得为该硬件设置一个信号量。当一个任务获得该信号量,那么这个任务就可以独占该信号量代表的资源(不一定是硬件资源)。
     如果这个任务顺利地执行完涉及到该资源的代码,并最后释放信号量,那么一切OK。此处没什么好说的。
    如果这个任务在执行的过程中(相关信号量还没有释放),比它优先级相同(时间片轮转的结果)或者更高(可剥夺型配置的结果)的其它任务获得CPU执行权(比当前任务优先级低的任务没有可能获得CPU执行权),在这种情况下,情况分为几种:
    1、如果另一个的任务没有用到该信号量,那么情况比较简单。
    2、如果另一个任务(称为第二个任务)用到该信号量,由于前一个任务(称为第一个任务)还没有释放该信号量,那么第二个任务必然得不到该信号量,为这个信号它必须等待(可设定有限时间的等待或者无限等待),也就是此任务被系统挂起。当第二个任务被系统挂 起后,第一个任务将重新获得CPU的执行权。这种情况叫优先级反转,也就是低优先级的任务反而优先运行。一旦第一个任务释放掉该信号量,系统将立即恢复第二个任务的执行。
   3、这种情况比较复杂。当第二个任务中断第一个任务运行时,第一个任务还没有释放该信号量,那么第二个任务必将被挂起,于是第一个任务被恢复运行,然而第一个任务继续运行的时候需要另外一个信号量,而这个信号量恰被第二个任务占有。于是我方有你需要的信号量,你方有我需要的信号量,两个任务就相互卡壳了,谁也执行不了了。这种情况在编程时,必须要避免,它就像是定时炸弹一样。

 

对于第三种情况,如果2个资源是用的一个互斥量,那么就不会出现两个任务各占一个资源的情况,从而排除。(当然这不是最好的办法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值