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