详解UCOS中的互斥信号量
二值信号量主要用于进行共享资源的独占式访问,比如我们用一个变量来标志一个资源是否可用,当这个变量为1的时候表示资源可用,当这个资源为0的时候表示资源不可用,但是二值信号量容易产生优先级反转,影响系统的实时性。互斥信号量一般用于降解优先级反转,优先级反转就是高优先级的任务的优先级被拉低了。具体如下:
我们有三个任务Task1,Task2,Task3,三个任务的优先级依次降低。
void Task1()
{
while(1)
{
OSSemPend(); //获取信号量
......
OSSemPost(); //释放信号量
}
}
void Task2()
{
while(1)
{
//注意任务2不需要信号量
}
}
void Task3()
{
while(1)
{
OSSemPend(); //获取信号量
OSSemPost(); //释放信号量
}
}
void main()
{
OSInit();
CreateTask(Task1); //1 最高
CreateTask(Task2); //2
CreateTask(Task3);
OSStart();
{
while(1)
{
OSSemPend(); //获取信号量
......
OSSemPost(); //释放信号量
}
}
void Task2()
{
while(1)
{
//注意任务2不需要信号量
}
}
void Task3()
{
while(1)
{
OSSemPend(); //获取信号量
OSSemPost(); //释放信号量
}
}
void main()
{
OSInit();
CreateTask(Task1); //1 最高
CreateTask(Task2); //2
CreateTask(Task3);
OSStart();