信号量的阻塞时间单位是系统的节拍周期configTICK_RATE_HZ为100,则系统节拍时钟周期为10ms,设置0就是不等待,设置1~无限就是按时钟节拍算时间,设置portMAX_DELAY等到有信号量有为止
xSemaphoreGive(XX)-----任务级信号量释放函数
xSemaphoreGiveFromISR(XX)-----中断级信号量释放函数
不管二值信号量、计数型信号量以及互斥信号量都是用xSemaphoreGive释放信号量
xSemaphoreTake(XX,阻塞时间)-----任务级信号量获取函数
xSemaphoreTakeFromISR(XX,阻塞时间)------任务级信号量获取函数
不管二值信号量、计数型信号量以及互斥信号量都是用xSemaphoreTake获取信号量
二值信号量 一般只能同步一个事件或者任务
xSemaphoreCreateBinary()-----动态创建二进制信号量
xSemaphoreCreateBinaryStatic()-----静态创建二进制信号量
二值信号量:
队列为1的信号量,一般用来实现任务同步,就是给一个标志位给其他任务,使用时候要注意任务占用时间,不然容易出现优先级翻转
创建实例
计数信号量
xSemaphoreCreateCounting(计数最大值,初始值)-----创建动态计算型信号量
xSemaphoreCreateCountingStatic()-----创建静态计算型信号量
计算型信号量:队列数量大于1的信号量
创建实例
优先级翻转:就是说高任务被低任务占用了资源一直处于阻塞态 实际表现出高低混乱的出错现象
一般用互斥信号量解决 但不是绝对不出现 只能降低出现的几率
互斥信号量
互斥锁主要作用高任务不会被低任务打断,低任务会进入阻塞态,等互斥锁高任务运行完
xSemaphoreCreateMutex()-----动态创建递归互斥信号量
xSemaphoreCreateMutexStatic()-----动态创建递归互斥信号量
互斥信号量:一般用来解决优先级翻转的错误现象,不能在中断里使用
互斥信号量和二值信号量的区别之一,互斥信号没释放量都可以接收信号量,借完钱最后一定要归还信号量,借钱操作还有个前提就是只能在本任务借钱,其他任务的钱借不了。
创建实例
递归互斥信号量 暂定后面更新
xSemaphoreCreateRecursiveMutex()-----动态创建递归互斥信号量
xSemaphoreCreateRecursiveMutexStatic()-----动态创建递归互斥信号量
递归互斥信号量:其实就是互斥信号量里面嵌套互斥信号量,实现层层保护,我也不懂有什么用 后面更新。
创建实例
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)