实时操作系统UCOS学习笔记11----UCOSIII信号量(Sem)和互斥信号量(Mutex)

本文介绍了UCOSIII操作系统中信号量的概念和使用,包括二进制信号量、计数型信号量的创建、请求与发送。此外,详细讨论了互斥信号量如何解决优先级反转问题,以及通过实验展示了信号量在任务同步和共享资源保护中的应用。
摘要由CSDN通过智能技术生成

在UCOSIII中有可能会有多个任务会访问共享资源,因此信号量最早用来控制任务存取共享资源,现在信号量也被用来实现任务间的同步以及任务和ISR间同步。在可剥夺的内核中,当任务独占式使用共享资源的时候,会出现低优先级的任务先于高优先级任务运行的现象,这个现象被称为优先级反转,为了解决优先级反转这个问题,UCOSIII引入了互斥信号量这个概念。本章,就来讲解一下UCOSIII的信号量和互斥信号量。

1、信号量

信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙,也就意味着该任务具有进入被锁部分代码的权限。一旦执行至被锁代码段,则任务一直等待,直到对应被锁部分代码的钥匙被再次释放才能继续执行。
信号量分为2种:二进制信号量与计数型信号量,二进制信号量只能取0和1两个值,计数型信号量不止可以取2个值,在共享资源中只有任务可以使用信号量,中断服务程序则不能使用。

1.1 二进制信号量
某一资源对应的信号量为1的时候,那么就可以使用这一资源,如果对应资源的信号量为0,那么等待该信号量的任务就会被放进等待信号量的任务表中。在等待信号量的时候也可以设置超时,如果超过设定的时间任务没有等到信号量的话那么该任务就会进入就绪态。任务以“发信号”的方式操作信号量。可以看出如果一个信号量为二进制信号量的话,一次只能一个任务使用共享资源。

1.2 计数型信号量
有时候我们需要可以同时有多个任务访问共享资源,这个时候二进制信号量就不能使用了,计数型信号量就是用来解决这个问题的。比如某一个信号量初始化值为10,那么只有前10个请求该信号量的任务可以使用共享资源,以后的任务需要等待前10个任务释放掉信号量。每当有任务请求信号量的时候,信号量的值就会减1,直到减到为0.当有任务释放掉信号量的时候信号量的值就会加1.

在这里插入图片描述

1.3 创建信号量
要想使用信号量,肯定需要先创建一个信号量,我们使用函数OSSemCreate()来创建信号量,函数原型如下:
在这里插入图片描述

  1. p_sem:指向信号量控制块,我们需要按照如下所示方式定义一个全局信号量,并将这个信号量的指针传递给函数OSSemCreate()。 OS_SEM TestSem;
  2. p_name:指向信号量的名字。
  3. cnt:设置信号量的初始值,如果此值为1,代表此信号量为二进制信号量,如果大于1的话就代表此信号量为计数型信号量。
  4. p_err:保存调用此函数后的返回的错误码。

1.4 请求信号量
当一个任务需要独占式的访问某个特定的系统资源时,需要与其他任务或中断服务程序同步,或者需要等待某个事件的发生,应该调用函数OSSemPend(),函数原型如下:
在这里插入图片描述

  1. p_sem:指向一个信号量的指针
  2. timeout:指定等待信号量的超时时间(时钟节拍数),如果在指定时间内没有等到信号量则允许任务恢复执行。如果指定时间为0的话,任务就会一直等待下去,直到等到信号量。
  3. opt:用于设置是否使用阻塞模式,有下面2个选项。
    OS_OPT_PEND_BLOCKING 指定信号量无效时,任务挂起以等待信号量。
    OS_OPT_PEND_NON_BLOCKING 信号量无效时,任务直接返回。
  4. p_ts:指向一个时间戳,用来记录接收到信号量的时刻,如果这个参数赋值NULL,则说明用户没有要求时间戳。
  5. p_err:保存调用本函数后返回的错误码

1.5 发送信号量
任务获得信号量以后就可以访问共享资源了,在任务访问完共享资源以后必须释放信号量,释放信号量也叫发送信号量,使用函数OSSemPost()发送信号量。如果没有任务在等待该信号量的话则OSSemPost()函数只是简单的将信号量加1,然后返回到调用该函数的任务中继续运行。如果有一个或多个任务在等待这个信号量,则优先级最高的任务获得这个信号量,然后由调度器来判定刚获得信号量的任务是否为系统中优先级最高的就绪任务,如果是,则系统将进行任务切换,运行这个就绪任务,OSSemPost()函数原型如下:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值