可能你还对信号量这个名词感到些陌生,其实你在Windows下经常使用信号量,比如:Esc键就发出一个信号,它可以通知某个进程去关闭当前的窗口。
那么,你也可以让按键(或其它东西)发出一个信号,使单片机去做某些事情。
在CoOS下使用信号量也是非常简单的。
具体步骤:创建信号量->发出信号量->处理信号量。
1、信号量是怎样实现的?
是使用PV操作。
在任务A中使用V操作,让s自加1;然后在任务B中使用P操作,每处理一次信号量,就让s自减1,减到0为止。
这样,不管任务A发出多少次信号量,任务B都能一个个处理掉。
2、CoCreateSem(),创建信号量
OS_EventID CoCreateSem(U16 initCnt,U16 maxCnt,U8 sortType);
initCnt就是PV操作中s的初始值,一般设为0。maxCnt就是s的最大值,视具体应用设置。
sortType是在多个任务中,使用多个信号量时候,内核需要对信号量进行排序,设为EVENT_SORT_TYPE_FIFO,就是先来先服务;设为EVENT_SORT_TYPE_PRIO,就是按照优先级服务。
如果成功创建信号量,会返回一个OS_EventID的变量,失败的话返回-1。
3、CoPendSem(),等待信号量
StatusType CoPendSem(OS_EventID id,U32 timeout);
id就是前面创建的信号量,timeout是等待信号量的时限,如果超时了,会返回E_TIMEOUT;有信号量过来的话,会返回E_OK。
由前面PV操作的原理可以看出,等待信号量的时候,是用了while(s==0);,这样任务会一直阻塞,后面的代码不起作用。
4、CoPostSem(),发出信号量
StatusType CoPostSem(OS_EventID id);
发出一个信号量id。