Vxworks信号量分析

 

Vxworks信号量分析

 

Wind内核中有二进制信号量、计数信号量和互斥信号量三种类型,为了使应用程序具有可移植性,还提供了POSIX(可移植操作系统接口)信号量。在Vxorks操作系统中,信号量是实现任务同步的主要手段,也是解决任务同步问题的最佳选择。

关于互斥的实现:
   
使用二进制信号量可以很方便的实现互斥,互斥是指多任务在访问临界资源时具有排他性。为使多个任务互斥访问临界资源,只需要为该资源设置一个信号量,相当于一个令牌,哪个任务拿到这个令牌即有权使用该资源。把信号量设为可用,然后将需要资源的任务的临界代码置于semTake()SemGive()之间即可。
注明:

1.       互斥中的信号量与任务优先级的关系:任务的调度还是按照任务优先级进行,但是在使用临界资源的时候只有一个任务获得信号量,也就是说还是按照任务优先级来获得信号量从而访问资源。只有当前使用资源的任务释放信号量SemGive(),其他任务按照优先级获得信号量。

2.       信号量属性中的参数为:SEM_Q_PRIORITY。而且在创建信号量的时候必须把信号量置为满的SEM_FULL。即信号量可用。


基本实现互斥模型:
SEM_ID  semMutex;
semMutex = semBCreate(SEM_Q_PRIORITY, SEM_FULL);
task(void)
       {
semTake(semMutex,WAIT_FOREVER);//
得到信号量,即相当于得到使用资源的令牌
//
临界区,某一个时刻只能由一个任务访问;
semGive(semMutex);
}

关于任务同步的实现:
   
同步即任务按照一定顺序先后执行,为了实现任务AB的同步,只需要让任务AB共享一个信号量,并设初始值为空,即不可用,semGive()置于任务A之后,而在任务B之前插入semTake()即可.
说明:

1.       还是讨论和优先级的关系。由于信号量初始化为空,不可用,所以可能使得优先级反转,即高优先级任务B在等待低优先级任务A释放信号量。只有执行了信号量释放语句semGive()后任务B得到信号量才能执行。

2.       属性参数的设置为SEM_Q_FIFOSEM_EMPTY

实现模式参考:
SEM_ID semSync;
semSync = semBCreate(SEM_Q_FIFO,SEM_EMPTY);
taskA(void)
{
……….
semGive(semSync);   //
信号量释放,有效。
}

taskB(void)
{
semTake(semSync,WAIT_FOREVER);  //
等待信号量。
……..
}

使用信号量注意事项:

1.       用途不同,信号量属性和初始值不同;

2.       互斥访问资源使,semTake()semGive()必须成对出现,且先后顺序不能颠倒;

3.       避免删除那些其他任务正在请求的信号量。

应用

1  确保任务优先级不反转:

SEM_ID  semFs;
SEM_ID  semFss;
SEM_ID  semFex;
semFs = semBCreate (SEM_Q_FIFO , SEM_EMPTY);
semFss = semBCreate (SEM_Q_FIFO , SEM_EMPTY);
semFex = semBCreate (SEM_Q_FIFO , SEM_EMPTY);  //
创建三个信号量
void t_imaGet(void)
{
    printf("a   ";
   semGive(semFs);             //
释放信号量
}

void t_imaJud(void)
{
   semTake(semFs,WAIT_FOREVER);     //
确保优先级不反转。
  printf("jj ";
  semGive(semFss);
}

void t_imaPro(void)
{
    semTake(semFss,WAIT_FOREVER);
    printf("rr"; 
   semGive(semFex);   
}

void t_imaExc(void)
{
     semTake(semFex,WAIT_FOREVER);
     printf("Y"; 
}

void start(void)
{
  int tGetId,tJudId,tProId,tExcId;
  tGetId = taskSpawn("tPget",200,0,1000,(FUNCPTR)t_imaGet,1,0,0,0,0,0,0,0,0,0);    
  tJudId = taskSpawn("tPjud",201,0,1000,(FUNCPTR)t_imaJud,3,0,0,0,0,0,0,0,0,0);
  tProId = taskSpawn("tPpro",202,0,1000,(FUNCPTR)t_imaPro,3,0,0,0,0,0,0,0,0,0);
  tExcId = taskSpawn("tPexc",203,0,1000,(FUNCPTR)t_imaExc,3,0,0,0,0,0,0,0,0,0);
}
以上例子虽然定了各个任务的优先级,但加上信号量可以实现同步,而且防止优先级反转出现。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
vxWorks中的信号量是一种同步工具,用于协调多个任务之间的访问资源。它可以用来控制对共享资源的访问,以防止资源竞争和数据冲突。 在vxWorks中,有两种类型的信号量:二进制信号量和计数信号量。二进制信号量用于互斥访问共享资源,当资源被一个任务占用时,其他任务将被阻塞。计数信号量用于多个任务之间的资源共享,它可以指定资源的可用数量,当资源不可用时,任务将被阻塞,直到资源可用。 使用vxWorks信号量时,首先需要创建一个信号量对象,并初始化它的值。可以使用`semBCreate()`函数创建二进制信号量,或使用`semCCreate()`函数创建计数信号量。然后,可以使用`semTake()`函数来获取信号量,表示任务要开始访问资源。如果信号量的值为0,任务将会被阻塞,直到信号量的值大于0。当任务完成对资源的访问后,需要使用`semGive()`函数释放信号量,表示资源可供其他任务使用。 在使用vxWorks信号量时,需要注意以下几点: 1. 保证每个任务在访问资源之前都使用`semTake()`函数获取信号量,以防止资源竞争。 2. 在任务完成对资源的访问后,必须使用`semGive()`函数释放信号量,以便其他任务可以使用资源。 3. 对于二进制信号量,每个任务应该在访问资源之前都获取到信号量,而在访问完成后都释放信号量。而对于计数信号量任务可以多次获取和释放信号量,直到资源不可用为止。 4. 可以使用信号量来控制任务之间的执行顺序,比如一个任务等待另一个任务完成后才能执行。 总之,vxWorks中的信号量是一种有助于协调多个任务对资源访问的重要工具,通过获取和释放信号量,可以确保对资源的访问按照预期的顺序进行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值