野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6025|回复: 2

[ucos] uCOS-III的多值信号量问题

[复制链接]
回帖奖励 18 火花 回复本帖可获得 2 火花奖励! 每人限 1 次
发表于 2018-3-10 20:34:08 | 显示全部楼层 |阅读模式
uCOS-III霸道板子例程,多值信号量--共享资源--停车场问题,在看程序过程中想到了一个问题,假设有些大客车每次需要占用2个车位,那么程序应该怎么写呢?

我首先想到的是     ctr = OSSemPend ((OS_SEM   *)&SemOfKey,               //等待该信号量 SemOfKey
                                                       (OS_TICK   )0,                       //下面选择不等待,该参无效
                                                       (OS_OPT    )OS_OPT_PEND_NON_BLOCKING,//如果不能立即获得信号量,不堵塞当前任务
                                                                                                                        //不继续等待信号量
                                                       (CPU_TS   *)0,                       //不获取时间戳
                                                       (OS_ERR   *)&err);                   //返回错误类型
OSSemPend函数操作后会使得信号量的值-1,那么可以当大客车来的时候连续两次调用OSSemPend函数,就可以实现信号量-2,则停车位-2,经过验证后发现,上述方法存在一个问题,当停车位只有1个时(即信号量值为1时),若此时申请信号量(停车位)的是一辆大客车,那么按正常逻辑是无法申请到2个停车位供大客车停放,所以大客车等待,且停车场还剩1个停车位;但是使用上述方法会使得大客车先执行一次OSSemPend函数,停车位(信号量)-1,然后再执行下一个OSSemPend函数的时候,提示停车场已经满了,这时候本应该是大客车等待且还剩一个停车位的,变成了大客车等待没有停车位了。

对于上述情况应当怎样做呢?
回复

使用道具 举报

发表于 2018-3-12 08:47:18 | 显示全部楼层

回帖奖励 +2 火花

这个应该分开,大客车和普通客车用不同的信号量
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-12 19:10:21 | 显示全部楼层
随风 发表于 2018-3-12 08:47
这个应该分开,大客车和普通客车用不同的信号量

我现在分开了,就是对于信号量的增加和减少需要每次变化为2,内核里的函数是+1或-1,难道是要更改内核函数吗?这样的话不是只适用于变化2而+1和-1又不满足了,我用的另一种方式是对信号量直接使用结构体改变它的值,但是感觉程序这样写不严密
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-8 17:34 , Processed in 0.030156 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表