天天看点

FreeRTOS——互斥量互斥量递归互斥量

FreeRTOS——互斥量

  • 互斥量
  • 递归互斥量

互斥量

互斥量是包含优先级继承机制的二进制信号量。二进制信号量是实现同步(任务之间或任务与中断之间)的更好选择,而互斥量是实现简单互斥的更好选择。

当用于互斥时,互斥量就像一个用于保护资源的令牌。当任务希望访问资源时,它必须首先获得(“获取”)令牌。当它完成资源的使用后,它必须“释放”令牌——允许其他任务有机会访问相同的资源。

互斥量与信号量使用相同的访问 API 函数,因此也允许指定阻塞时间。阻塞时间表示如果互斥量不是立即可用的,则在尝试“获取”互斥量时,任务应进入阻塞状态的最大“滴答”数。然而,与二进制信号量不同 —— 互斥量采用优先级继承。这意味着如果高优先级任务在尝试获取当前由较低优先级任务持有的互斥量(令牌)时阻塞,则持有令牌的任务的优先级会暂时提高到阻塞任务的优先级。该机制旨在确保较高优先级的任务在尽可能短的时间内保持在阻塞状态,从而最大限度地减少已经发生的“优先级反转”。

优先级继承并不能解决优先级反转!它只是在某些情况下最小化其影响。硬实时应用程序应该首先设计为不会发生优先级反转。

不应在中断中使用互斥量,因为:

  • 它们包括一个优先级继承机制,只有在互斥量是从任务中释放和获取时才有意义,而不是中断。
  • 中断不能阻塞以等待由互斥量保护的资源变为可用。
FreeRTOS——互斥量互斥量递归互斥量

使用互斥锁来保护对共享资源的访问。

递归互斥量

递归使用的互斥量可以被所有者反复“获取”。在所有者为每个成功的

xSemaphoreTakeRecursive()

请求调用

xSemaphoreGiveRecursive()

之前,互斥量不会再次可用。例如,如果一个任务成功地“获取”同一个互斥量 5 次,那么该互斥量将无法用于任何其他任务,直到它也准确地“释放”了 5 次互斥量。

这种类型的信号量使用优先级继承机制,因此一旦不再需要信号量,“获取”信号量的任务必须始终“释放”信号量。

不能在中断服务程序中使用互斥类型信号量。

不应在中断中使用互斥量,因为:

  • 它们包括一个优先级继承机制,只有在互斥量是从任务中释放和获取时才有意义,而不是中断。
  • 中断不能阻塞以等待由互斥量保护的资源变为可用。

继续阅读