找回密码
 立即注册
查看: 287|回复: 7

UCOSII中上电开始语音播报同时按下按键,电磁阀和状态等第一遍播报完成才动作、切换?

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-2 14:06:10 | 显示全部楼层 |阅读模式
本帖最后由 380091044 于 2024-7-9 08:41 编辑

UCOSII中上电开始语音播报同时按下按键,电磁阀和状态等第一遍播报完成才动作、切换?一种状态语音播报3遍,每遍语音播报间隙,电磁阀动作,状态切换,

我想要达到效果是,语音播报同时摁下按键,检测到按键按下时,停止语音,电磁阀立马动作和状态立即切换,语音切换新的播报内容,这才是系统应该有的实时性,更换延时函数,任务切换换及时,语音只能播报一次?应该是3次,


void Voice_Announcements(void *p_arg)
{
        if(p_arg);
        while (1)
        {               
                        U8 j;        
                        U8 i;        
                  OSTaskResume(1);//恢复按键检测,就绪等待;
                        if(key_lock3==0 && key_lock4==1 && Flag_work==0)//拐弯;
                        {        
                                j=0;
                        if(i<3)//拐弯检测
                                {
                                        led_L=0;//开启拐弯指示灯
                                        YY_OUT_2=0;//开启语音播报
                                        OSCtxSw();//
                                       OSTimeDly(1000);//
                                        YY_OUT_2=1;//关闭语音播报
//                                        OSCtxSw();//
//                      OSTimeDly(3500);//
                                        i++;
                                }
                  }
                        if(key_lock3==1 && key_lock4==0  && Flag_work==0)//Flag_position==0;直行;
                        {
                                        i=0;
                                        if(j<3)//直行检测
                                        {
                                                led_U=0;//开启直行指示灯
                                                YY_OUT_2=0;//开启语音播报
                                               OSCtxSw();//加不加都行
                                               OSTimeDly(100);//        
                                                YY_OUT_2=1;//关闭语音播报
//去掉以下两行,可以快速打断语音,但是只能播报一次语音????
//                                                OSCtxSw();//加不加都行
//                                                OSTimeDly(4500);//
                                                j++;                                       
                                        }
                        }
         

        }//任务3_while结束
}//任务3结束;
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-2 16:33:01 | 显示全部楼层
本帖最后由 tzz1983 于 2024-7-2 16:52 编辑

简单的问题先不要想什么OS不OS, 用最直接的方法, 该怎么干就怎么干.  (问题很单纯, 复杂的是人呢)

其次, 练好基本功和编程习惯, 这小段代码, 局部变量未赋初值 就用于判断了呢, 所以最好是中午写代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-2 16:57:07 | 显示全部楼层
tzz1*** 发表于 2024-7-2 16:33
简单的问题先不要想什么OS不OS, 用最直接的方法, 该怎么干就怎么干.  (问题很单纯, 复杂的是人呢)

其次,  ...

这个代码裸机程序都生产了很多了,就把以前代码移植到系统里面了,局部变量定义时,确实没有赋初值,我是在下面的代码中状态相反的部分清零,赋初值的,我的很多想法,验证完后,确实是不行的,摸索中,感谢老师指点。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-3 08:31:33 | 显示全部楼层
阻塞情况下,并没有任务切换,中断的按键扫描是有效的,按键处理并没有动作,

点评

Delay_MS(3500) 这个不叫阻塞, 这个应该叫作 "站着等你三千年", 再加500年  详情 回复 发表于 2024-7-3 10:30
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-3 10:30:04 | 显示全部楼层
38009*** 发表于 2024-7-3 08:31
阻塞情况下,并没有任务切换,中断的按键扫描是有效的,按键处理并没有动作, ...

Delay_MS(3500)  这个不叫阻塞, 这个应该叫作 "站着等你三千年", 再加500年
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-3 11:10:10 | 显示全部楼层
tzz1*** 发表于 2024-7-3 10:30
Delay_MS(3500)  这个不叫阻塞, 这个应该叫作 "站着等你三千年", 再加500年

你说的对,这个延时和裸机程序的死等是一样,但是等时间短了,语音播报就播报不完就出现了交叉,目前这个值播报是正常,就按键打断语音实时差,其他都正常的,
我也使用“OSTimeDly(OS_TICKS_PER_SEC / 2);”这个延时,结果,语音触发的LED灯一直亮,不灭了,语音也只播报一次,按键也不动作了,理论上应该是能正常工作的
还是我的代码问题,




/*****毫秒级延时函数*****/
void Delay_MS(unsigned int ms)
{
        unsigned int i;//延时计数;
        do
        {
                i = MAIN_Fosc / 6000;//6次/毫秒
                while(--i);
        }
        while(--ms);
}




点评

你问的问题太细了, 自己研究吧  详情 回复 发表于 2024-7-3 11:16
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:5
  • 最近打卡:2025-04-30 07:46:22

33

主题

1079

回帖

2319

积分

荣誉版主

积分
2319
发表于 2024-7-3 11:16:07 | 显示全部楼层
本帖最后由 tzz1983 于 2024-7-3 11:17 编辑
38009*** 发表于 2024-7-3 11:10
你说的对,这个延时和裸机程序的死等是一样,但是等时间短了,语音播报就播报不完就出现了交叉,目前这个 ...

你问的问题太细了, 自己研究吧

或者说不是一点问题 , 是整个基础面都不好, 很难解释
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:498
  • 最近打卡:2025-05-02 07:00:13
已绑定手机

151

主题

589

回帖

1200

积分

金牌会员

积分
1200
发表于 2024-7-3 14:01:22 | 显示全部楼层
tzz1*** 发表于 2024-7-3 11:16
你问的问题太细了, 自己研究吧

或者说不是一点问题 , 是整个基础面都不好, 很难解释

往往是越急,越是找不到问题所在,先放放,再仔细研究一下,
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-2 20:44 , Processed in 0.167484 second(s), 95 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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