xlander 发表于 2007-12-10 16:15

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

初学ucOS有些术语不专业,见谅。<br /><br />假设有一个信号量,0表示空闲,1表示占用。我现在的理解是这样,信号量的变化都是操作系统自己维护的,不需要用户过多干预。用户只要调用OSSemPend()就是等待信号量,等待成功后,信号量被当前任务占用,至于什么时候释放信号量,还是由操作系统负责,不需要用户调用额外的函数,即任务进入等待状态后,信号量就被释放。<br /><br />那么,有个任务调用OSSemPend()后,信号量被当前任务占用,这个容易理解?<br /><br />那么什么时候,信号量会变成空闲呢?<br /><br />下面是我的理解,如果不对,一定要告诉我,要不然会害死我的。<br /><br />1、任务调用OSTimeDly之类的函数,让出CPU,进入等待状态;<br />在这种情况下,信号量被释放,其他任务可以抢占该信号量。<br /><br />2、第二种情况,也是我不能理解的情况,请高人解惑。<br />有两个任务,高优先级的任务A需要顺序(也就是依次)等待信号量m,n,m可通过中断使能,n为与低优先级任务B互斥访问某资源的信号量。<br />假设任务A正在等待m,当前任务为B,并抢占了信号量n,此时中断出现,并使m有效,也就是说任务A就绪,按理说此时CPU应切向任务A,那么关键的问题来了,此时信号量n会出现什么样的变化?<br />释放?数据有可能混乱。<br />不释放?那就是死锁。

dld2 发表于 2007-12-10 16:31

理解错误

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

xlander 发表于 2007-12-10 16:35

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

OSSemPost()?

dld2 发表于 2007-12-10 16:37

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

xlander 发表于 2007-12-10 17:22

OK,谢谢两位

页: [1]
查看完整版本: 关于ucOS信号量的基本概念的困惑