OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2446|回复: 1

uc/osii 信号量的问题

[复制链接]

18

主题

51

帖子

0

精华

初级会员

Rank: 2

积分
166
金钱
166
注册时间
2014-1-3
在线时间
24 小时
发表于 2016-4-19 20:57:48 | 显示全部楼层 |阅读模式
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,后面的蜂鸣器就不响了????



正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165225
金钱
165225
注册时间
2010-12-1
在线时间
2107 小时
发表于 2016-4-19 20:57:49 | 显示全部楼层
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-1 18:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表