互斥量(Mutexes)可以概括成拥有优先级继承属性的二值信号量(你看,信号量、互斥、队列其实都是类似的,只不过各自的特俗属性使得在某些应用场合更加合适而已)。

    Mutexes(‘MUT’ual ‘EX’clusion)更适合完成互斥,二值信号量更适合完成同步。

    在很多嵌入式应用中,某个外设通常情况下是需要独占的去使用的,比如一个串口,如果A任务需要发送”hello”,B任务发送”world”,如果不去加以控制,两个任务都能同时得到这个串口的使用权,因为内核调度的缘故,最终发送出来的可能是”heworllold”。这将毫无意义。互斥量即可以解决这个问题,任务在使用某个资源时,必须先获得使用权限,此时其他任务因为无法获得这个资源的使用权限而阻塞,等待任务使用完成,释放资源使得资源重新变为可用,此时等待这个资源的其他任务获得使用权。

    以上,其实也就是互斥量的使用方法。互斥量于信号量使用相同的API,因此也可以设置超时时间。与二值信号量不同的是,互斥量具有优先级继承的特性,这是为了防止优先级反转而设计的。当一个高优先级的任务在等待一个资源而被阻塞时,当前获得该资源的低优先级任务将短暂继承高优先级任务的优先级。当然,一个硬实时系统在设计的时候就应该避免这种情况。

    互斥量不能在中断中使用:

    • 互斥量的优先级继承属性意味着只能在任务间使用
    • 中断在等待一个互斥量保护的资源的时候,不能阻塞

    下图是,互斥量的使用图:

    互斥量