FreeRTOS递归互斥锁与避免死锁
死锁是另一个可能由于使用互斥事件或互斥锁而发生的问题。 在上一个教程中,我们学习了如何在 Arduino 中使用 FreeRTOS mutex API。 我们已经看到如何使用互斥锁来避免优先级继承。 但是互斥锁也会造成任务之间的死锁问题。 死锁是当两个任务处于阻塞状态等待一个和另一个同时持有的资源时的一种现象。
1、死锁示例
例如,在一个实时嵌入式应用中,有Task1和Task2等两个任务。 还有两个互斥量标记,例如 x 和 y。 Task1 开始执行并接受 x 个互斥锁。 一段时间后,Task2 抢占 Task1 并在获取互斥体 y 后开始执行。 但是在执行了一些指令之后,Task2 尝试获取互斥锁 x。 但是它已经被Task1占用了。 因此,Task2 将进入阻塞状态并等待互斥锁 x 可用。
现在,Task1 可以再次执行,但经过一段时间后,Task1 想要获取互斥锁 y,但它已经被 Task2 获取了。 作为响应,它也会进入阻塞状态。 结果,两个任务都进入阻塞状态,等待两个任务已经取得的互斥令牌。 因此,将无法执行任何任务。 这种情况称为死锁。
简而言之,在这种情况下,Task1 将等待 Task2 持有的互斥锁。 同样,Task2