当信号量值大于0,任务调用OSSemPend()
函数接收信号量时:
当信号量值等于0,任务调用OSSemPend()
函数接收信号量时:
注意:μC/OS-III不允许在中断服务程序中等待信号量。
前面章节我们学习了互斥信号量,下面对计数型信号量与互斥信号量做一个对比。
1.2 任务间同步
在实际的应用中,常用信号量实现任务间的同步,OSSemPend()
和OSSemPost()
会出现在不同任务中,但不一定成对出现。
注意:在实际的应用中,还有多对多、一对多信号量操作的情况,但很不常见,建议不要设计出这样的操作方式,这样会带来很多的麻烦。
用来实现任务间同步的信号量在创建时赋给初始值,一般为0,表示事件还未发生,初始值在OSSemCreate()
函数中指定。
让一个LED以0.5Hz的频率闪烁,每按键一次,LED闪烁一次。
我们通过此例来说明如何使用信号量实现任务间同步,两个任务处理流程如下。
TaskKEY
任务主要代码如下。
TaskLED
任务主要代码如下。