初级会员
- 积分
- 166
- 金钱
- 166
- 注册时间
- 2014-1-3
- 在线时间
- 24 小时
|
1金钱
我用的是战舰旧版的,是信号量和邮箱的实验,关于信号量程序的理解
//蜂鸣器任务
void beep_task(void *pdata)
{
u8 err;
while(1)
{
OSSemPend(sem_beep,0,&err);
BEEP=1;
delay_ms(60);
BEEP=0;
delay_ms(940);
}
}
······
void main_task(void *pdata)
{
u32 key=0;
u8 err;
u8 semmask=0;
u8 tcnt=0;
while(1)
{
key=(u32)OSMboxPend(msg_key,10,&err);
switch(key)
{
case 1://控制DS1
LED1=!LED1;
break;
case 2://发送信号量
semmask=1;
OSSemPost(sem_beep);
break;
case 3://清除
LCD_Fill(0,121,lcddev.width,lcddev.height,WHITE);
break;
case 4://校准
OSTaskSuspend(TOUCH_TASK_PRIO); //挂起触摸屏任务
TP_Adjust();
OSTaskResume(TOUCH_TASK_PRIO); //解挂
ucos_load_main_ui(); //重新加载主界面
break;
}
if(semmask||sem_beep->OSEventCnt)//需要显示sem
{
POINT_COLOR=BLUE;
LCD_ShowxNum(192,50,sem_beep->OSEventCnt,3,16,0X80);//显示信号量的值
if(sem_beep->OSEventCnt==0)semmask=0; //停止更新
}
关于信号量我是这样理解的,在main_task中,我按键连续按下好几个,比如连续按下5下,这时候由于main_task的任务级别较高,
连续执行5次
case 2://发送信号量
semmask=1;
OSSemPost(sem_beep);
break;
此时,sem_beep->OSEventCnt就记数达到5,液晶显示LCD_ShowxNum(192,50,sem_beep->OSEventCnt,3,16,0X80);//显示信号量的值
当beep_task()执行时,每次执行请求函数,sem_beep->OSEventCnt就减一次,知道为0,蜂鸣器就响了5次。
我的问题:是否当sem_beep->OSEventCnt减到0,后面的蜂鸣器就不响了????
|
|