完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我用的是战舰旧版的,是信号量和邮箱的实验,关于信号量程序的理解
//蜂鸣器任务 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,后面的蜂鸣器就不响了???? |
|
相关推荐
1个回答
|
|
|
|
只有小组成员才能发言,加入小组>>
800 浏览 0 评论
1156 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2714 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1090浏览 3评论
195浏览 2评论
461浏览 2评论
374浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
456浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 02:31 , Processed in 1.440992 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号