野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13782|回复: 5

关于freertos实时性的问题

[复制链接]
发表于 2020-8-5 18:01:25 | 显示全部楼层 |阅读模式
最近在做一个新的项目,想着上freertos,但是实际使用过程中遇到了一些问题:
1、正常裸奔的时候,我会划分若干个任务,每个任务对应一个状态机,这样可以做到完全不会阻塞,实时性很高,若外部来了命令停止当前所有任务,各个任务可以快速响应。
2、使用RTOS后,我同样创建了若干个任务,每一个任务对应一个while(1)循环,然后问题就来了,我如何能够实时的响应外部发过来的命令(至少要响应到几十毫秒级别),停止结束当前任务?
     (1)、第一种写法如下
  1. <blockquote>void test::serverThread()
复制代码
现在问题是,如果整个执行流程特别长,若我刚刚好执行到doThings2()的位置,此时有外部命令过来要求停止当前任务的运行,我该如何快速响应退出



     (2)、任务中使用状态机

  1. <blockquote>uint8_t test::serverThread()
复制代码
这种写法在每一个任务里还是使用状态机来处理, xQueueReceive使用查询不阻塞的方式,状态机里也没有任何阻塞,如果正在干活的时候有新的消息过来,可以很快的响应,但是感觉这样跟裸机没什么区别了???各位兄弟有什么建议吗?我第一次在正式项目中使用这个系统,要求设备收到停止命令后可以很快的停止正在运行的所有设备,还望各位不吝帮忙。





回复

使用道具 举报

发表于 2020-8-6 19:24:29 | 显示全部楼层
裸奔能响应这么快吗,不都轮训的吗,除非几个状态互斥才有可能不阻塞吧,万一有个在delay,其他的能正常响应?(除了中断)
freertos这种带系统的一般都有任务的优先级,而且是分片运行,有外部任务过来,可能不能做到瞬间响应,但是如果优先级高,也就慢一点点。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 15:00:34 | 显示全部楼层
a5820736 发表于 2020-8-6 19:24
裸奔能响应这么快吗,不都轮训的吗,除非几个状态互斥才有可能不阻塞吧,万一有个在delay,其他的能正常响 ...

裸奔用状态机来做,把任务拆分成若干个状态机,不会有任务阻塞,整个程序执行一遍也就几个MS的时间,对于裸奔的delay也是用状态机查询的方式,并不会阻塞,对于命令的响应可以做到几十个毫秒是没问题的。
void test::serverThread()
{
        ...
        while(1) {
                if(xQueueReceive(mainMotorMsg, &recvMsg, portMAX_DELAY)) {
                        doThings1();
                        vTaskDelay(10);
                        ...
                        doThings2();
                        vTaskDelay(10);
                        ...
                        doThingsN();
                        vTaskDelay(10);
                }
        }
}


对于操作系统,比如上面的,如果执行到doThings2的时候希望能够立即响应外部来的命令,停止当前任务,我的想法就是把vTaskDelay用消息队列来替代,队列的超时时间就是vTaskDelay的时间,这样当收到消息后可以立即退出。或者在任务中使用状态机,这样也没有任务阻塞,收到命令后也能立即退出。
回复 支持 反对

使用道具 举报

发表于 2020-8-7 15:45:31 | 显示全部楼层
任务中用状态机肯定是可以的。
我还是很好奇裸机在有大量任务的情况下,状态机能做到瞬间相应。比如大量数据存储eeprom时,串口接收到数据要处理,不是不能立刻响应吗。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-7 16:40:56 | 显示全部楼层
a5820736 发表于 2020-8-7 15:45
任务中用状态机肯定是可以的。
我还是很好奇裸机在有大量任务的情况下,状态机能做到瞬间相应。比如大量数 ...

有那种连驱动都是状态机写的,对于那种外置的eeprom可以用中断的方式往里面写,驱动会自己搞定,然后用状态机不断查询驱动的状态,查询到了写完成再进行下一步,这个过程是不需要阻塞的。
还有若是在操作系统的任务中用状态机,那跟裸机写有啥区别?我就是为了不想用状态机查来查去才准备用操作系统的。
回复 支持 反对

使用道具 举报

发表于 2020-8-7 19:12:33 | 显示全部楼层
xinming.luan 发表于 2020-8-7 16:40
有那种连驱动都是状态机写的,对于那种外置的eeprom可以用中断的方式往里面写,驱动会自己搞定,然后用状 ...

那搞linux android这种开发的都不用状态机了?都是在几个线程或task里做事,当然需要状态机了
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-5-5 03:44 , Processed in 0.041098 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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