概念理解:
信号量就是一个量,设为N。当N=0的时候,代表本任务(资源)不可用,处于等待状态,当调用函数OSSemPost(Sem_Event);发送一次信号量,此时N=1,本任务可执行,执行完毕后N=N-1。等下新的信号量到达。有点类似标志位。
新建信号量:
OS_EVENT * Sem_Event;
OS_SEM_DATA result[];
u8 err;
打下划线为用到的变量,事先声明。
1、Sem_Event=OSSemCreate(4); //创建信号量并初始化为4.
2、OSSemPend(Sem_Event,0,&err); //请求信号量,若信号量有效(cnt>0),那么任务继续运行,否则进入等待状态
实际上,函数就是判断N是非为0,为0任务等待。>0继续运行,并且N-1。
3、OSSemPost(Sem_Event); //发送一次信号量,即N+1;
4、 OSSemDel(Sem_Event,OS_DEL_ALWAYS,&err);
//删除信号量Sem_Event之后,信号量讲无效,所有任务将不受限信号量,注意下划线的变量
5、OSSemQuery(Sem_Event,result); //查询信号量Sem_Event的状态
count=result->OSCnt; //获取信号量Sem_Event的计数值=count