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:52 编辑
简单的问题先不要想什么OS不OS, 用最直接的方法, 该怎么干就怎么干.(问题很单纯, 复杂的是人呢)
其次, 练好基本功和编程习惯, 这小段代码, 局部变量未赋初值 就用于判断了呢, 所以最好是中午写代码 tzz1983 发表于 2024-7-2 16:33
简单的问题先不要想什么OS不OS, 用最直接的方法, 该怎么干就怎么干.(问题很单纯, 复杂的是人呢)
其次,...
这个代码裸机程序都生产了很多了,就把以前代码移植到系统里面了,局部变量定义时,确实没有赋初值,我是在下面的代码中状态相反的部分清零,赋初值的,我的很多想法,验证完后,确实是不行的,摸索中,感谢老师指点。 阻塞情况下,并没有任务切换,中断的按键扫描是有效的,按键处理并没有动作, 380091044 发表于 2024-7-3 08:31
阻塞情况下,并没有任务切换,中断的按键扫描是有效的,按键处理并没有动作, ...
Delay_MS(3500)这个不叫阻塞, 这个应该叫作 "站着等你三千年", 再加500年 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:17 编辑
380091044 发表于 2024-7-3 11:10
你说的对,这个延时和裸机程序的死等是一样,但是等时间短了,语音播报就播报不完就出现了交叉,目前这个 ...
你问的问题太细了, 自己研究吧
或者说不是一点问题 , 是整个基础面都不好, 很难解释
tzz1983 发表于 2024-7-3 11:16
你问的问题太细了, 自己研究吧
或者说不是一点问题 , 是整个基础面都不好, 很难解释
往往是越急,越是找不到问题所在,先放放,再仔细研究一下,
页:
[1]