09-2_信号量的常规使用

  • 二进制信号量实现互斥
    • 要先把信号量写入
  • 计数型信号量实现同步
    • 但是要注意,让ready状态/读取信号量的任务的优先级高于running态/写信号量的任务,或者让写信号量的任务在写完主动让出

10-1_互斥量的理论讲解

  • 正常实现互斥要谁上锁谁解锁,所以引入互斥量
  • 但是互斥量也没实现上边这一点
  • 优先级反转和优先级继承,通过优先级继承解决优先级反转

10-2_互斥量的常规使用

  • 优先级反转是指的通过二进制应该Give信号量让高优先级任务Take后执行,结果却是另一个低优先级的任务抢占执行了,让高优先级task无法执行。
  • 优先级继承是高优先级人把自己的优先级给低优先级任务,低优先级完成后再把优先级还给高优先级,让中等优先级的任务没有机会抢占。

10-3_互斥量的缺陷和递归锁

  • 互斥量必须实现谁持有谁释放
  • 但是一般的互斥量并不能实现上边的需求,例如:
    • xSemaphoreTake和xSemaphoreGive
  • 所以引入递归锁---只能由拥有者开锁,谁锁的门谁开锁

11-1 事件组的理论讲解

  • 每个bit代表一个事件
  • 等待事件组要么是全部时间要么是其中某一个
    • 等待要求是可以设置的

11-2 _事件组的使用_等待事件

  • 事件组是不能传递数据的,传递数据需要其他的方式来
  • 通过事件组来等待事件完成,然后队列传递数据

11-3 _事件组的使用_同步点

  • xEventGroupSync()表示自己做好了

12-1 任务通知理论讲解

  • 任务通知不需要单独创建,不需要一个公共结构体来实现独写操作
  • 任务结构体中就包含了内部对象,可以直接接收别的任务发过来的“通知”
  • 其他方式是多对多,任务通知是多对一
  • 其他任务放数据时不需要等待,要么成功要么失败,不会进入阻塞状态
  • 目标任务可以等待,无数据时;有数据即刻返回
  • 他的结构体灭有两个链表,只有一个通知状态,这个状态是给自己使用
  • 通过任务通知可以实现其他的模式,例如队列,事件,事件组等

12-2 _任务通知使用_轻量级信号量

  • 可以选择Take完就清空,也可以一次次Take全部

12-3 _任务通知使用_轻量级队列

  • 不需要创建队列
  • 把val房间TCB中,可以选择覆盖或者不覆盖
  • 任务1往队列中放十个数据,任务2就可以取十次数据
  • 任务通知就直接任务1通知任务2使用句柄

12-4 任务通知使用轻量级事件组

  • 不能指定等待的具体事件
posted on 2024-12-09 20:57  明图  阅读(18)  评论(0)    收藏  举报