Free RTOS中阻塞延时任务未完成时,需要打断或是取消该任务,如何操作?
1、当语音播报延时,进行了任务切换执行别的代码时,这时摁下按键,状态指示和电磁阀都动作了,上一次的语音还正在播报,这次语音只能等上次语音播报完毕,再播报,语音切换不及时?如何在延时阻塞
任务没有执行完,新的任务来临时,打断/取消旧任务??有哪些方法可以操作?
if(key_lock3==0 && key_lock4==1 && Flag_work==0)//拐弯检测
{
j=0;
if(i<3)//拐弯语音播报正常三次,第一次正播报时,状态切换需要播报执行了,还是要等这次播报完成,才能播报直行?
{
YY_OUT_2=0;//开启语音播报
vTaskDelay(1000);//这个延时任务切换后,状态变了,需要及时取消语音开启状态,切换新的语音如何操作???
YY_OUT_2=1;//关闭语音播报
vTaskDelay(3500);
i++;
}
}
本帖最后由 tzz1983 于 2024-7-9 09:23 编辑
一般来说, 这种视听类的, 毫秒级响应是足够了, 所以最简单的办法就是查询, 而不是用信号量.
这里给两个方案:
1.基于查询的, 基本和祼机编程是一样的
void task( *nnnn)
{
while(1)
{
static 计时器 = xx;
static 运行状态 = yy;
查询当前按键值。
if(按键值 == ?)
{
对应的键值处理(大概就是重新设置计数器运行状态)
}
switch (运行状态)
{
case:
break;
case:
break;
default:
break;
}
vTaskDelay(1);
}
}
2. 基于OS信号量的。 只说一个思维导图。
这个任务需要等待的事件有两个:
1. 延时时间到
2. 有按键需要处理。
做一个标志集(OS信号量类型的东西),
在任务外, 每当1毫秒到(计数信号量), 或者按键有效时, 设置对应的标志集标志。
任务等待标志集, 跟据标志集的标志做相应的处理。 (事件响应性能好,超越毫秒级是肯定的)
其实说实话, 这个简单的事情没有必要搞这么复杂, 第一种方案又简单又实用.
虽然说OS有许多功能和服务可以用, 但这不代表一定要用, 或者滥用。
tzz1983 发表于 2024-7-9 09:18
一般来说, 这种视听类的, 毫秒级响应是足够了, 所以最简单的办法就是查询, 而不是用信号量.
这里给两 ...
感谢指点,
页:
[1]