5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
12
返回列表 发新帖
楼主: payne_pan
打印 上一主题 下一主题

[求助帖] 飞控(下) 讨论飞控该不该用手机cpu, 该不该又操作系统

[复制链接]
21
发表于 2017-3-10 23:38 | 只看该作者
点击查看详情
本帖最后由 crossa 于 2017-3-10 23:57 编辑

关于实时性的问题,操作系统不会干扰实时性的,反过来说,甚至可以强化实时性,优先把时间片分配给用户空间的程序,当下Linux、nuttx系统就是这么干的。
所谓的非实时性,是有条件的,不是说什么程序都不是实时的。


飞控有操作系统绝对是有好处的,高度集成化,反而成本来的低,不用搭很多模块上天,等于是把服务器飞到天上去了,飞行只是副产品。
而且有个优势是无操作系统的飞控比不了的,那就是多处理器协同工作,无操作系统的驾驶仪,你想这么干?你能写出调度多个运算核心的算法时,等于是在做操作系统的事。

关于稳定性,我可以这么说:只要别碰微软的东西(当然这几年有改善)有操作系统的东西出故障的概率和无操作系统出故障的概率是一样的。有操作系统的,普通故障更容易排除!


最重要的是进入智能化时代之前,系统是一定要普及的,只不过系统未必是当下系统的形态。否则结果就和当年苏联搞运放电路不搞集成电路一样




欢迎继续阅读楼主其他信息

22
发表于 2017-3-10 23:40 | 只看该作者
如果要是冗余运行,应该多路同时运算,就是MCU IMU这些都是平行多路运算通过引入仲裁机制判定哪路故障,从而无缝切换,有几点注意1:系统内避免或减少“单点”。2:多路并行计算,应该至少三组并行运算,最简单的仲裁方法如三路运算做比较,少数服从多数。
23
 楼主| 发表于 2017-3-11 08:12 | 只看该作者
本帖最后由 payne_pan 于 2017-3-11 08:16 编辑
crossa 发表于 2017-3-10 23:38
关于实时性的问题,操作系统不会干扰实时性的,反过来说,甚至可以强化实时性,优先把时间片分配给用户空间 ...


linux需要打实时补丁, 即便打了,上下文,进程切换也要花点时间, 但这点时间对于高速度的cpu不算什么, 实时补丁的作用应该是改善任务的调度机制
如果是轮询的设备 (传感器读取应该是轮询),cpu主动去读
如果是中断io,  用中断处理

如果视频处理是低优先级的,飞控是高优先级的,如果飞控处理误入死循环,就会干扰视频处理。(高通的飞控程序运行在 dsp 上,不知道是如何和操作系统结合的?)
完全死机倒是不用担心, 因为进程都隔离和保护了,大不了就是一个进程完蛋再重启。




24
 楼主| 发表于 2017-3-11 08:14 | 只看该作者
caosix2 发表于 2017-3-10 23:36
片选 信号 当然是 【主 处理器】 发出哟 。要做 冗余 —— 难度不小 —— 以三个 单元为例:

多谢指教!  这部分要研究还是要花时间的。

25
发表于 2017-3-11 10:43 | 只看该作者
本帖最后由 crossa 于 2017-3-11 16:24 编辑
payne_pan 发表于 2017-3-11 08:12
linux需要打实时补丁, 即便打了,上下文,进程切换也要花点时间, 但这点时间对于高速度的cpu不算什么 ...

1. 先说Linux的实时性,这个实时性补丁是针对内核模块和线程而言的,而飞控运行在用户空间,几乎不会去太多使用线程以及内核模块(px4firmware)就是个典型例子,前台是抢占用式的话,依然能保证所谓“实时性”。而且前台飞控程序必须以root身份运行。所谓内核实时补丁,是针对内核模块和线程而言的,用户空间里,飞控关键部分都不是用线程来解决的,nuttx系统下直接就是进程队列,可以参考下px4firmware的代码。对内核编译熟悉的人,都很清楚,Linux 内核里面,进程管理模式是可选的。而且现在不光有实时补丁了,还有专门的实时API。 更何况sleep,awake这样的操作过程,不管你怎么做,都是时间上很严格,不可能因为内核的所谓“非实时性”产生不精确的问题。

2. 即使用了裸机跑飞控,没有系统,仔细去看看飞控,用的是orb的机制,本身就是个异步的东西,何来完全实时之说?传感器得到数据处理后发布,轮到订阅者读取完后,才会做出实际的操作,而且订阅者是在队列里的,本身就是个轮询的过程。真搞不懂,这种所谓“实时性”的要求,是不是一个死胡同。说白,其实只要保证是抢占式的进程管理模式,使用任务队列而不是线程为主,发布的数据能被订阅者及时读取,及时处理,就能保证所谓“实时性”。我可以这么说,这楼主概念里理解的“实时性”就是个死胡同
3.既然都知道当下跑Linux的是高速CPU了,进程切换不是问题,那么那个所谓 优先级的问题 就是个伪命题了。道理很简单,现在普通的 高速CPU,不少都是2核心,4核心,Linux这样的系统优势就是多CPU,这玩意10多年前就如此,而且这个10多年里,一步步从服务器跨到桌面、手机端,当年我说这些,周边同行都觉得是疯话,可现在是现实,但是当下事实摆在眼前了。当下飞控程序、图形以及各类只占很少的资源,以后只会更少,就因为"摩尔定律"在这个领域里也依然试用。而且飞行器上天,并不是 服务器端Linux系统的高并发高IO应用场景,这种情况下,根本不用考虑优先级,因为反正怎么样都够用,而且编译成抢占式任务后,用户空间的启动大开销的程序,时钟都是占用时间片最多,但是还是那句话,对应现在的处理器,根本就是微不足道的资源占用,本身就比那些M核心的套着ARM指令的单片机快了不知道多少,都放在最高优先级,也占不满系统资源,而且在任务处理消耗资源都很少的场合下,这个优先级根本就不是问题(现实情况也是如此,飞控+图传+导航这类对于高速CPU来说,本就是低资源消耗的应用),更何况,当下的处理器配合系统,大部分都支持SMP,不是一个核或者一个CPU在系统上死扛。

4.飞控程序出错的问题,这个不用考虑,因为道理非常简单,跑在操作系统下的飞控会出错,那么无操作系统飞控一样也可能会出错,没有任何事实能说明某一种方式出错概率高,如果出错追回了,这时候的结果会有什么区别?无操作系统时,出错了,整个都出错,有操作系统时出错了,通过系统还能知道飞控出错,飞控挂掉,操作系统也不一定会宕机,但是这个出错如果会导致事故,你不管是否有系统,结果都一样。非要保险,要么在允许的情况下引入人工操作要么有备份的系统。

5.楼主最大的问题就是,忽视了“木桶效应” 任何系统说白了都是一个整体,目标是整个系统的工作,而不是仅仅一个子系统正常工作。比如汽车,油泵坏了,不能开了就是不能开了,其他设备再正常也没用。飞控系统就是各个模块协同工作的结果,少一个必要模块都会出问题。关键性的模块坏了,其他模块再正常也没用,不能工作就是不能工作,没什么妥协之说

7. 楼主,你误导了那个开发超声波的小哥。道理很简单,“实时性" 这个问题你钻了牛角尖。任务调度,你也钻了牛角尖,我已经给你解答过了。如果按照你的思路  ,
navio,pxfmini,以及我现在已经完成的飞控,就是不该存在的东西了。当下实时就是,这些东西已经有能力超越那些没有系统的单片机飞控,更重要的是,下一步的5G网络,2,3年内就会开放,
目前物联网领域很快就会从控物,跨入进入数据时代了,楼主你好好回想下你的思路。如果按照你的思路下个时代,会怎么样。当年老毛子不搞集成电路搞运放,结果如何?你现在这个想法又和当年搞运放不搞IC的专家何尝不是一样。


我给楼主讲个过去的例子:

以前office流行起来之前,办公系统份额loutes有大部分,后来出了个新的版本,他们的人员发现市面的上的计算机性能不够跑这个,于是改软件,改到当时的计算机跑的动。
等他们改到那个程度的时候,才发觉,设备都更新了,早就不是问题了,反而白白浪费了研发的时间。
我是一个从DOS时代尾巴上走过来的技术人员,我见过的已经玩完系统都不少了,而且更重要的是,未来的控物、联网、数据相关的小设备系统,也未必是Linux,这个绝对不会奇怪。

当年比尔盖茨还说过,内存640K(DOS能使用的常规内存)就够了,结果呢?

楼主也切勿闭门造车,有时候,思维方式比技术能力要重要,睁开眼睛,fan qiang出去看看,国内外,带系统的飞控已经比比皆是,飞行只是众多功能中一个副产品而已,本质是小型服务器飞上天了。就喝当下的智能汽车一样,汽车+电脑。15年前年智能手机刚出现的时候,我买回家用,一样被周围人笑话,因为大家手里都是功能机。看看现在呢?











26
 楼主| 发表于 2017-3-11 17:37 | 只看该作者
本帖最后由 payne_pan 于 2017-3-11 19:59 编辑
crossa 发表于 2017-3-11 10:43
1. 先说Linux的实时性,这个实时性补丁是针对内核模块和线程而言的,而飞控运行在用户空间,几乎不会去太 ...

我没有不赞成操作系统,反而是支持的。关键是融合
你说cpu处理图形快,我不这么认为,图形处理快是有GPU, 没GPU, cpu 不看重负


既然依靠操作系统了,就要享受kernel的服务,接收它的管理。 你把用户态的进程说得很强大,我要好好查资料(因为用户态进程正在运行,突然有个低电压异常,操作系统会先处理哪个?,操作系统运行特权级别,向操作系统索要高优先级中断,看os是否允许)

多谢指教!大部分内容,我是赞成的。
大家在严格的思考中都能获得进步。




27
 楼主| 发表于 2017-3-11 19:52 | 只看该作者
本帖最后由 payne_pan 于 2017-3-11 19:53 编辑

难得遇到能一起热烈讨论的,我把问题分层下面几个方面 (先写几个,后面想到再加),看能否一起讨论,加深对飞控的认识
1)纯用户态进程(不用在用户空间和kernel空间切换)效率高 (以前用过futex),所以飞控用这种方式
那么os,还需要打rt补丁否?

2) 传感器是否需要编写驱动,提供文件句柄操作?

3) 等待唤醒常用 select,进程通信用pipe  或 binder 都要靠操作系统调度
这里面都有线程,进程的调度。
(用android大量使用binder的情况看,够快,很少延迟,应该满足要求)

4) 图像海量数据处理,是否该利用gpu
(我过去曾用 cpu 运行 mesa,速度慢的要命,因为cpu是通用的,而gpu是针对图像的)

(后面想到再加上)


28
发表于 2017-3-11 19:58 | 只看该作者
本帖最后由 crossa 于 2017-3-11 20:04 编辑
payne_pan 发表于 2017-3-11 17:37
我没有不赞成操作系统,反而是支持的。关键是融合
你说cpu处理图形快,我不这么认为,图形处理快是有GPU ...

所以,我才说你进死胡同了么
我给你大致说一下为啥不能融合进内核模块以及那个异常处理

1.  内核态,缓冲区使用要求也异常严格,所以内核态的模块非常难调整,不小心就会弄崩整个系统,但是内核态优势就是内核模块间API的调用。这就是为啥posix系统里,飞控内部使用队列来处理的,而飞控只做为进程。

2. 内核态是真正的时间不严格,即使打了RT补丁,依然会有维护线程队列的开销,而且那个维护队列的周期,内核里可调的,但是用户态下,抢占式,不存在这个问题,能分配足够多的CPU

3. 大部分像我使用卡片电脑的用户,系统一定是会升级的,你自己写的内核模块,一但内核升级到新版,内核模块都要重新编译过,一旦是大的主版本号升级(比3.2升级到4.4),可能几乎还要重写,内核升级主要意义很简单:修BUG,提升安全性,甚至优化系统,后面的内核都是专门对ARM处理器做了优化的,基本只有古早的系统不升级内核

4. 关于你说的异常处理,我这么跟您说:不少异常处理,基本是在某个进程队列里的单一进程去巡查的,你也可以用中断和通知,但是对于较严格的东西,绝对不会放在内核来处理,道理很简单,Linux功能开发第一要务,不要把有时间严格要求的功能写到内核模块里,本身内核也不使用用户系统里的运行库。


5.关于图形,我这么说,市面上常见的各种A系列处理器,基本都是GPU,本就是为处理图形而生的,作为CPU用也只是副产品,所以才会有图形处理上的优势,你要是奢侈点,可以用nvidia的。

6.并不是我把用户态说的多强大,内核态用户态的本质区别,是把资源给隔开了,对于我们正在干的事而并不会性能上成倍差异,反过来,飞控搞进内核,才是吃饱了撑的自找苦头的事。kernel的主要服务就是内存管理,进程调度,以及设备驱动的映射,以及外围设备通信,说白了就是管理你的硬件资源。为你服务的系统服务,都是以用户态存在的,挂在后台运行,如果你把飞控的计算为主事情丢给内核,实际上还不如放在用户空间,因为用户空间时间可控,内核里就不是了。还有就是内核和系统,也不是一回事。内核也只是一部分,更重要的是切记:多任务系统里,进程运行有前后台之分的,抢占式的场合下,前台的进程比后台的优先级高

7.进程管理这方面,优先级得看你的内核工作在那种进程管理模式下,这是在内核编译时自己进行选择的,但是,有一点,可以告诉您老,进程的权重,用户自己都可以控制台上调整,普通用户和root用户启动的程序都不是一样的权重。

所以说您老有些地方需要再仔细的研究一下。系统其实不难,麻烦的事,很多人对系统几乎没有什么概念。在应用复杂,集成度高的场合下,有系统的优势也摆在那儿了,值得用系统做的,用系统来管理硬件能省去很多麻烦。 我以前搞过个金融工程的货,上亿数据的迭代遍历运算,而且数据是分块的。整个运算过程,放在现在的电脑上,3分钟解决,放在嵌入式设备上,因为性能不如大功率的CPU,所以较慢,要多花好几倍的时间,但是如果没有系统,这个要死人的,道理很简单,迭代遍历运算,多任务才是最快的,单进程裸机能处理多少?无法想象。如果没有系统参与,那么这个无法想象的



29
 楼主| 发表于 2017-3-11 20:05 | 只看该作者
本帖最后由 payne_pan 于 2017-3-11 20:08 编辑
crossa 发表于 2017-3-11 19:58
所以,我才说你进死胡同了么
我给你大致说一下为啥不能融合进内核模块以及那个异常处理

多谢,过去经验大多在 libc之上, 术业有专攻,对kernel还是缺乏深入理解。(但我绝对没想过把飞控做到kernel,   只是想了解哪些方式能够避免过多在用户态和 kernel态切换)



30
发表于 2017-3-11 20:15 | 只看该作者
payne_pan 发表于 2017-3-11 20:05
多谢,过去经验大多在 libc之上, 术业有专攻,对kernel还是缺乏深入理解。(但我绝对没想过把飞控做到ke ...

你参考下px4firmware,这个程序全程用户态,所以也就没有所谓“实时性”问题,而且我都说了哪个实时性是个伪命题,本就是个使用ORB机制的东西,说白了就是让发布、读取、处理三个动作分配到更多时间而已。目前市面上的Linux飞控,没有一个把姿态处理塞进内核的,内核里只是加些模块做设备映射而已 ,但这也是不方便的地方,飞他们的固件,连系统都不能轻易升级了。‘
后台任务只有一种情况能得到多的时间片: 大运算量(CPU占用多)  高IO

这类后台任务通常是数据库、承压的服务器之类的服务,而且都是面临巨大的访问量时,才会出现,当下的飞控上,暂时还不会有那么复杂的应用场景,就算以后有了,硬件绝对都已经升级好几代了。估计也早不是问题

31
 楼主| 发表于 2017-3-11 20:20 | 只看该作者
crossa 发表于 2017-3-11 20:15
你参考下px4firmware,这个程序全程用户态,所以也就没有所谓“实时性”问题,而且我都说了哪个实时性是 ...

多谢! 回头看了px4firmware,还要找你多交流。

32
发表于 2017-3-11 20:33 | 只看该作者
payne_pan 发表于 2017-3-11 20:20
多谢! 回头看了px4firmware,还要找你多交流。

你说的有系统和无系统的两个硬件之间,最佳融合方式其实是有的,比如超声波应用,以市面上常见的能买到的4.5元的模块来说,如果直接挂载到有系统的设备上,就是开个进程在那儿一直跑着,如果要融合,也简单,裸机程序,计算量又不大,但是需要控制循环一直循环着,这类事交给单片机来解决,无非就是走通信协议和主机通信呗。融合方式依然和普通的设备一样,但是处理起来更简单!

33
 楼主| 发表于 2017-3-11 21:56 | 只看该作者
crossa 发表于 2017-3-11 20:33
你说的有系统和无系统的两个硬件之间,最佳融合方式其实是有的,比如超声波应用,以市面上常见的能买到的 ...

不错, 现在我使用的数码管,液晶,都是i2c, 连接线少,还省单片机计算资源。

34
发表于 2019-6-6 23:12 | 只看该作者
这些问题5G时代到来,都绕过或者迎刃而解了.
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /2 下一条

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