Binary Semaphore 二进制信号

创建信号量,向下兼容,不推荐使用

推荐使用这个创建信号

释放信号量

  1. 使用信号量执行任务

enter description here

创建信号量之后为了使用它必须要释放它。

文档中提到了创建之后要释放它

  1. 创建信号量并调用任务

创建信号量并释放,task才可以调用

  1. 任务一进行调用使用信号量

任务一

  1. 任务二调用使用信号量

Task2

  1. 结果

全局变量

说明Task1和Task2锁住了全局变量

  1. 未使用信号量呢

Task

  1. 结果

没有使用信号量则会交替进行加一

计数信号量

获取信号量数目

取得可用信号成功则锁住

创建计数信号量

  1. 创建任务

创建任务

  1. 使用计数信号量,最大信号量减减

使用信号量

  1. 释放信号量

每到第六秒释放一个信号量

  1. 结果

第五秒后没有信号量,第六秒进行释放后进行使用

每隔六秒可以获得一个信号量

互斥量 mutex

创建互斥量

这块需要反复理解

  1. 创建信号量,挂起任务调度器,创建执行任务,开启任务调度器

创建互斥信号量、挂起任务调度器、创建执行任务、开启任务调度器

Task1

Task2

Task3

主要是优先级的继承,task1继承了task3所以可以执行任务

互斥信号量

互斥信号量

task3优先级最高首先运行,发生阻塞后task2开始执行,task2发生阻塞,task1开始执行,获取信号量并锁定。
由于task3的优先级高,所以task3开始执行,然而信号量依旧在task1那,并未被释放task1超出时间片,看门狗被触发,idle任务因为要用于内存的清理回收,idle任务无法执行,就会触发看门狗。
所以task3尝试取信号量,尝试失败后进入task2while循环,循环超时触发看门狗,然后task继续3尝试获取信号量。以此反复。

使用二进制信号量

二进制信号量的结果

Recursive Mutex 递归互斥锁

task1获取A信号量并锁住,A需要B,所以继续获取B并锁住

创建递归互斥锁

创建并执行任务调度器

Task2

Task1

结果:

结果

结果