380091044 发表于 2024-7-2 14:06:10

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

本帖最后由 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结束;

tzz1983 发表于 2024-7-2 16:33:01

本帖最后由 tzz1983 于 2024-7-2 16:52 编辑

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

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

380091044 发表于 2024-7-2 16:57:07

tzz1983 发表于 2024-7-2 16:33
简单的问题先不要想什么OS不OS, 用最直接的方法, 该怎么干就怎么干.(问题很单纯, 复杂的是人呢)

其次,...

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

380091044 发表于 2024-7-3 08:31:33

阻塞情况下,并没有任务切换,中断的按键扫描是有效的,按键处理并没有动作,

tzz1983 发表于 2024-7-3 10:30:04

380091044 发表于 2024-7-3 08:31
阻塞情况下,并没有任务切换,中断的按键扫描是有效的,按键处理并没有动作, ...

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

380091044 发表于 2024-7-3 11:10:10

tzz1983 发表于 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);
}




tzz1983 发表于 2024-7-3 11:16:07

本帖最后由 tzz1983 于 2024-7-3 11:17 编辑

380091044 发表于 2024-7-3 11:10
你说的对,这个延时和裸机程序的死等是一样,但是等时间短了,语音播报就播报不完就出现了交叉,目前这个 ...
你问的问题太细了, 自己研究吧

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

380091044 发表于 2024-7-3 14:01:22

tzz1983 发表于 2024-7-3 11:16
你问的问题太细了, 自己研究吧

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


往往是越急,越是找不到问题所在,先放放,再仔细研究一下,
页: [1]
查看完整版本: UCOSII中上电开始语音播报同时按下按键,电磁阀和状态等第一遍播报完成才动作、切换?