打印

关于ucOS信号量的基本概念的困惑

[复制链接]
4575|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xlander|  楼主 | 2007-12-10 16:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
初学ucOS有些术语不专业,见谅。

假设有一个信号量,0表示空闲,1表示占用。我现在的理解是这样,信号量的变化都是操作系统自己维护的,不需要用户过多干预。用户只要调用OSSemPend()就是等待信号量,等待成功后,信号量被当前任务占用,至于什么时候释放信号量,还是由操作系统负责,不需要用户调用额外的函数,即任务进入等待状态后,信号量就被释放。

那么,有个任务调用OSSemPend()后,信号量被当前任务占用,这个容易理解?

那么什么时候,信号量会变成空闲呢?

下面是我的理解,如果不对,一定要告诉我,要不然会害死我的。

1、任务调用OSTimeDly之类的函数,让出CPU,进入等待状态;
在这种情况下,信号量被释放,其他任务可以抢占该信号量。

2、第二种情况,也是我不能理解的情况,请高人解惑。
有两个任务,高优先级的任务A需要顺序(也就是依次)等待信号量m,n,m可通过中断使能,n为与低优先级任务B互斥访问某资源的信号量。
假设任务A正在等待m,当前任务为B,并抢占了信号量n,此时中断出现,并使m有效,也就是说任务A就绪,按理说此时CPU应切向任务A,那么关键的问题来了,此时信号量n会出现什么样的变化?
释放?数据有可能混乱。
不释放?那就是死锁。

相关帖子

沙发
dld2| | 2007-12-10 16:31 | 只看该作者

理解错误

信号量(这里仅说互斥)就两个操作,一个请求,一个释放。
一个任务请求信号量时:如果被其它任务占用,则该任务等待,同时导致任务切换;如果没有被其它任务占用,则获得,继续执行。
释放信号量时,如果其它高优先级任务正在请求并等待该信号量,则导致任务切换。
OSTimeDly之类,并不导致信号量的释放。只有获取信号量的那个任务调用释放功能时,信号量才会释放。

使用特权

评论回复
板凳
xlander|  楼主 | 2007-12-10 16:35 | 只看该作者

那么释放信号量的函数是那个呢?

OSSemPost()?

使用特权

评论回复
地板
dld2| | 2007-12-10 16:37 | 只看该作者

反正这两个一个是请求一个是释放。

使用特权

评论回复
5
xlander|  楼主 | 2007-12-10 17:22 | 只看该作者

OK,谢谢两位

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

65

主题

165

帖子

0

粉丝