深入理解 FreeRTOS 互斥锁:原理、应用与实践
1. 互斥锁基础
互斥锁(Mutex)这个术语源于“mutual”(相互)和“exclusion”(排斥)。在 FreeRTOS 中,既然已经有了二进制信号量,为何还需要互斥锁呢?互斥锁有什么独特的能力是二进制信号量所没有的呢?
1.1 互斥原理
和二进制信号量一样,互斥锁是一种实现互斥访问的机制。其互斥原则同样基于约定,互斥锁本身并不直接排除或允许访问。按照约定,一个任务只有在成功获取互斥锁后,才能访问受保护的资源。在 FreeRTOS 术语中,这被称为“获取”(take)互斥锁。一旦任务获取了互斥锁,它就成为该资源的唯一所有者。
当所有者使用完资源后,通过“释放”(give)互斥锁来开放对资源的访问。释放互斥锁后,其他任务就可以获取它。通过这种协议,同一时间不会有多个任务同时访问受保护的资源。
例如,有两个任务要驱动同一总线上的 I2C 设备。总线是设备共享的,但一次只能进行一个事务。互斥锁可以让这两个独立的任务与各自的从设备通信,同时避免在共享总线上发生冲突。
1.2 问题分析
假设有三个任务 A、B 和 C。任务 A 和 B 都需要使用由二进制信号量保护的共享 I2C 总线进行互斥访问。任务 A 的优先级为 1,任务 B 的优先级为 3,任务 C 的优先级为 2。具体事件顺序如下:
1. 任务 B(优先级 3)因等待消息队列而被阻塞。
2. 任务 C(优先级 2)由于某种原因也被阻塞。
3. 由于没有更高优先级的任务准备好,任务 A(优先级 1)开始执行。它锁定了 I2C 总线的信号量,成为所有者。 <
超级会员免费看
订阅专栏 解锁全文
1528

被折叠的 条评论
为什么被折叠?



