二值信号量作用:任务通过OSSemPend()函数获得一个信号量,如果信号量有效(不为0),则任务继续运行,否则进入等待状态。互斥信号量作用:任务通过OSMutexPend()函数获得互斥信号量,如果互斥信号有效(不为0)则继续运行,否则进入等待。
那么他们之间区别在哪?
假设有三个任务A,B,C,他们的优先级分别为10、20、30,而任务A和C共同使用一个二值信号量。现在任务C得到信号进入运行,这时候任务B也进入就绪,由于B优先级比C高,就会剥夺任务C的CPU控制权,如果这时候任务A需要运行,可是因为信号量被任务C获得还没释放被任务B挂起,所以A得不到运行,这样即使任务A优先级比B高也无法得到运行,这就是优先级反转。如果任务A是比较紧急的任务,那么就会影响实时性。
为了解决二值信号带来的这个问题,于是出现了互斥信号,
它的机制就是:
当一个优先级较低的任务获得了一个互斥信号时,系统会把这个任务的优先级提高到最高,让它不被抢占,这样这个任务就会更快运行完而释放互斥信号提交给更高的任务使用,之后这个任务的优先级就会回到原来的等级。还是A、B、C举例,任务C首先得到一个互斥信号,这时系统会把C的优先级提高到最高,这样就不会被B抢占&#