大学生
最后登录1970-1-1
在线时间 小时
注册时间2017-5-4
|
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函数的时候,提示停车场已经满了,这时候本应该是大客车等待且还剩一个停车位的,变成了大客车等待没有停车位了。
对于上述情况应当怎样做呢?
|
|