01-信号量
本质
一种特殊的队列,没有写位置与读位置,只有计数值与长度,但是有着rtos内部机制的保护,使用起来安全。
方法
1-创建
2-释放与获取信号量
注意,在中断和非中断中调用函数不一样
释放信号量(加一)
获取信号量(减一)
若是将获取信号量的时间设置为最大,则可以让其在获取不到的时候永远阻塞
3-逻辑
如果多个任务都在等待获取信号量,那么如果有,高优先级的任务先获得,同等优先级先申请的先获得
4-注意
1-调用的时候发现找不到这个函数
点击查找
找到了,将其头文件在首页引用
好了
02-优先级反转
缘由:
存在三个优先级分别为1,2,3的任务A,B,C,其中AC调用同一信号量。
若A先运行,没归还信号量时,B开始运行且不等待,则A永远无法归还信号量,在C开始运行时,由于A无法归还信号量,则永久卡死。即B通过卡死A的信号量卡死了C,即为优先级反转,可通过互斥量解决(特殊的队列)。
03-互斥量
(好有用啊)
互斥量是一种特殊的信号量(函数长得也差不多)
创建后初始值为1
特殊之处在于
1-存在RTOS的保护程序,所以数据安全可信,比使用全局变量保护一些过程(如IIC)可靠得多
2-存在优先级继承。回到刚刚的问题,如果C在等待A使用的互斥量,则A的优先级则提高到C的水平,在A完成调用后优先级回退,这样就不会被B卡死了
极其有用的使用方案:保护某些不能打断的过程
rtos总是不断切换任务,iic数据传输可能被打断导致传输失败,此时可以加上保护措施,即在运行伊始获取,在传输完毕释放,解决了前几篇文章中提到的全局变量不安全的问题。