UCOSIII信号量和互斥信号量

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

信号量
信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一旦获得了钥匙也就意味着该任务具有进入被锁部分代码的权限 。一旦执行至被锁代码段,则任务一直等待到对应被锁部分代码的钥匙再次释放才能继续执行。
信号量分为两种:二进制与计数型,二进制信号量只能取0和1两个值,计数型信号量不止可以取2个值,在共享资源中只要有任何可以使用信号量,中断服务程序则不能使用。
1.二进制信号量
某一资源对应的信号量为1的时候,那么就可以使用这一资源,如果对应信号量为 0,那么等待该信号量的任务就会被放进表中。在等待信号量的时候也可以设置超时,如果过设定的间任务没有等到信号量话那么该就会进入绪态。任务以“发信号”的方式操作信号量。 可以看出如果一个信号量为二进制的话,一次只能一个任务使用共享资源。
2.计数型信号量
有时候我们需要可以同时有多个任务访问共享资源,这个时候二进制信号量就不能使用了,计数型信号量就是用来解决这个问题的。比如某一个信号量初始化值为10,那么只有前10个请求该信号的任务可以使用共享资源,以后的任务需要等待前10个任务释放掉信号量。每当有任务请求信号量的时候,信号量的值就会减1,知道减为0.当有任务释放掉信号量的时候信号量就会加1.
![信号量API函数](https://img-blog.csdn.net/20160808103057934)

创建互斥型信号量
创建互斥型信号量使用函数OSMutexCreate()
p_mutex : 指向互斥型信号量控制块。互斥型信号量必须有用户应程序进行实际分配,可以使用如下所示代码。
    OS_MUTEX MyMutex;
p_name: 互斥信号量的名字
p_err: 调用此函数后返回的错误码。

请求互斥型信号量
当一个任务需要对资源进行独占式访问的时候就可以使用函数OSMutexPend(),如果该互斥信号量正在被其他的任务使用,那么UCOSIII就会将强求这个互斥信号量的任务放置在这个互斥信号量的等待表中。任务会一直等待,知道这个互斥信号被释放掉,或者设定的超时时间到达位置。如果在设置的超时时间到达之前信号量被释放,UCOSIII将会恢复所有等待这个信号量中的优先级最高的任务。
注意!如果占用该互斥信号量的任务比当前申请互斥信号量的任务优先级低的话,OSMutexPend()函数将会占用该互斥信号量的任务优先级提到和当前申请任务的优先级一样。当占用互斥信号量的任务释放掉该互斥信号后,恢复到之前的优先级。
p_mutex : 指向互斥信号量。
timeout : 指定等待互斥信号量的超时间(钟节拍数),如果在指定的时间内互斥信号量没有释放,则允许任务恢复执行。该值设置为0的话,表示任务将会一直等,直到信号量被释放掉。
opt : 用于选择是否使阻塞模式。
      OS_OPT_PEND_BLOCKING 指定互斥信号量被占用时,任务挂起等待该互斥信号量。
      OS_OPT_PEND_NON_BLOCKING 指定当互斥信号量被占用时,直接返回任务。
      注意!当设置为 OS_OPT_PEND_NON_BLOCKING  ,是 timeout 参数就没有意义了,应该设置为0。
p_ts : 指向一个时间戳,记录发送、终止或删除互斥信号量的时刻。
p_err: 用于保存掉用此函数后返回的错误码。

发送互斥信号量
我们可以通过调用函数OSMutexPost()来释放互斥型信号量,只有之前调用过函数OSMutexPend()获取互斥信号量,才需要调用OSMutexPost()函数来释放这个互斥信号量
p_mutex: 指向互斥信号量。
opt: 用来指定是否进行任务调度操作
    OS_OPT_POST_NONE 不指定特的选项
    OS_OPT_POST_NO_SCHED 禁止在本函数内执行任务调度操作。
p_err: 用来保存调此函数返回的错误码。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值