FreeRTOS 同步各类方法的对比

能实现同步、互斥的内核方法有:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)。

它们都有类似的操作方法:获取/释放、阻塞/唤醒、超时。比如:

  • A获取资源,用完后A释放资源
  • A获取不到资源则阻塞,B释放资源并把A唤醒
  • A获取不到资源则阻塞,并定个闹钟;A要么超时返回,要么在这段时间内因为B释放资源而被唤醒。

这些内核对象五花八门,记不住怎么办?我也记不住,通过对比的方法来区分它们。

  • 能否传信息?只能传递状态?
  • 为众生?只为你?
  • 我生产,你们消费?
  • 我上锁,只能由我开锁
内核对象 生产者 消费者 数据/状态 说明
队列 ALL ALL 数据:若干个数据 谁都可以往队列里扔数据, 谁都可以从队列里读数据 用来传递数据, 发送者、接收者无限制, 一个数据只能唤醒一个接收者
事件组 ALL ALL 多个位:或、与 谁都可以设置(生产)多个位, 谁都可以等待某个位、若干个位 用来传递事件, 可以是N个事件, 发送者、接受者无限制, 可以唤醒多个接收者:像广播
信号量 ALL ALL 数量:0~n 谁都可以增加一个数量, 谁都可消耗一个数量 用来维持资源的个数, 生产者、消费者无限制, 1个资源只能唤醒1个接收者
任务通知 ALL 只有我 数据、状态都可以传输, 使用任务通知时, 必须指定接受者 N对1的关系: 发送者无限制, 接收者只能是这个任务
互斥量 只能A开锁 A上锁 位:0、1 我上锁:1变为0, 只能由我开锁:0变为1 就像一个空厕所, 谁使用谁上锁, 也只能由他开锁

使用图形对比如下:

  • 队列:
    • 里面可以放任意数据,可以放多个数据
    • 任务、ISR都可以放入数据;任务、ISR都可以从中读出数据
  • 事件组:
    • 一个事件用一bit表示,1表示事件发生了,0表示事件没发生
    • 可以用来表示事件、事件的组合发生了,不能传递数据
    • 有广播效果:事件或事件的组合发生了,等待它的多个任务都会被唤醒
  • 信号量:
    • 核心是”计数值”
    • 任务、ISR释放信号量时让计数值加1
    • 任务、ISR获得信号量时,让计数值减1
  • 任务通知:
    • 核心是任务的TCB里的数值
    • 会被覆盖
    • 发通知给谁?必须指定接收任务
    • 只能由接收任务本身获取该通知
  • 互斥量:
    • 数值只有0或1
    • 谁获得互斥量,就必须由谁释放同一个互斥量

FreeRTOS 同步各类方法的对比

赞(1)
未经允许不得转载:极客笔记 » FreeRTOS 同步各类方法的对比
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址