同步互斥与通信

← 返回 MOC | ← 相关原理 | ← 主页


Queue

  • 适合在任务和任务之间,或者 ISR 和任务之间传数据。
xQueueCreate();
xQueueSend();
xQueueReceive();

Semaphore

  • 二值信号量更像“事件到了没”的通知。
  • 计数信号量更像“还剩几个资源”的计数器。

Mutex

  • 互斥量强调“资源所有权”,更适合保护共享资源。
  • 互斥量通常带优先级继承,用来压制优先级反转。
  • 不要因为二值信号量“也能让任务阻塞”,就拿它直接替代互斥量。

Event Group

  • 适合“多个条件位组合判断”的场景。
  • 当你关心的是一组事件状态,而不是一份数据时,它比队列更自然。

Task Notification

  • 一对一事件通知时,任务通知通常比队列和信号量更轻。
  • 用它之前先问清:你是在传数据,还是在传“某个事情发生了”。

和死锁、优先级反转的关系

  • 多任务以不同顺序抢多个资源时,可能走向死锁。
  • 低优先级任务持锁、高优先级任务等锁时,可能出现优先级反转。
  • 锁顺序、超时、减少持锁时间,是很实际的设计手段。

这一篇要盯住什么

  • 同步、互斥、通信不是一回事。
  • 队列偏传数据,信号量偏同步,互斥量偏护资源。
  • 优先级继承为什么只对互斥量最关键。