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 任务通知使用轻量级事件组
- 不能指定等待的具体事件