关于计数型信号量

计数型信号量

在事件控制块中增加了计数器,这个计数器可以表示为事件发生的次数或者对资源数量的管理。计数信号量有释放信号量操作和获取信号量操作,释放信号量操作的时候计数器的值会加一,获取信号操作,计数器的值减一,如果减到0任务会进入到等待状态;具体操作方式有两种,如下所示:

Wait操作和Notify操作,接下来会详细描述这两个操作的具体过程。Wait操作,首先等待计数器的值是否为大于0,如果大于0,将计数值减一,然后返回。如果不是大于0,则该任务进入到等待状态;Notify操作,会判断是否有任务在等待,如果有任务等待则取首个等待的任务唤醒然后返回,如果没有任务则计数值加一后,返回;

设计原理

设计原理如上图所示,在事件控制块中增加一个计数器变量,等待队列中存放等待的任务,计数变量表示次数。

具体实现获取和释放的操作过程

上图表示计数信号量获取的过程,判断计数值是否为0,如果为0,将任务增加到等待队列;如果不为0,则将计数器减一;

上图表示计数信号量的释放过程,判断队列中是否有等待的任务,如果有将等待任务释放;如果没有,将计数器加一;

实现例程

tTask1实现无超时的等待信号量,tTask2向tTask1发送一个通知;tTask3会超时等待信号量2

实现方法

tSemWait()函数,设置信号量的等待,判断信号量计数值是否为0,如果不为零,减一退出;如果为零,将任务插入到事件队列中。

tSemNotify()函数,检查信号量任务中是否有任务等待,如果有,取出位于等待任务队列的第一个任务。并将任务加入到就绪队列的首位。进行任务的切换。

实现例程2

tTask1中定义按键KEY1,当KEY1按下时,发送tSemNotify函数,在tTask2中,tSemWait()函数无超时等待信号量,任务的系统延时时间为100ms,具体执行过程如下描述所示:

当key1被按下时,执行tSemNotify函数,此时没有事件控制块中没有任务在等待,所以直接将计数器加一,在按下都是加一;当开始执行tTask2的时候,由于计数器不为0,所以计数器直接减一后退出,获得计数器的值,进入到系统延时。只到所有的计数值清0,将任务2加入到信号量1的事件等待控制块中,当key1被按下,直接唤醒tTask2,继续重复执行上面的操作。

猜你喜欢

转载自blog.csdn.net/qq224feng/article/details/83549111