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