380091044 发表于 2024-7-9 08:32:32

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:18:31

本帖最后由 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有许多功能和服务可以用, 但这不代表一定要用, 或者滥用。








380091044 发表于 2024-7-9 09:50:41

tzz1983 发表于 2024-7-9 09:18
一般来说, 这种视听类的, 毫秒级响应是足够了, 所以最简单的办法就是查询, 而不是用信号量.

这里给两 ...

感谢指点,
页: [1]
查看完整版本: Free RTOS中阻塞延时任务未完成时,需要打断或是取消该任务,如何操作?