当前位置: 首页 > 科技观察

为什么航天器和导弹喜欢用单片机而不是嵌入式系统?

时间:2023-03-12 13:19:57 科技观察

1.前言前几天,我和某研究所的一位研究员小聊了一下。他说:在目前的航空、航天和导弹等武器装备中,几乎所有的控制系统都采用单片机代替嵌入式系统。乍一看,这与我们的直觉相矛盾:这么高大上的设备,其控制逻辑一定非常复杂。没有嵌入式系统怎么能完成如此复杂的功能控制呢?仔细研究后,我意识到答案是:安全+可控。本篇我们就来说说单片机和嵌入式,操作系统和RTOS的那些事儿!通过本文,让您对操作系统的实时性能有一个系统全面的了解!2、关于单片机和嵌入式关于这两个系统的区别,说实话,没有人能给出一个标准正确的答案。大家理解的单片机和嵌入式系统略有不同。抛开硬件不说,从应用开发的角度,我是这样理解的:-Thread)等完成一些调度功能。嵌入式系统:使用嵌入式Linux操作系统和一些变体编写应用程序。我知道我的理解可能是错误的,至少不严谨,范围狭窄。既然没有标准答案,那我们就直接引用维基百科的定义吧。毕竟概念是死的,更重要的是我们如何根据实际需要去做。选择。1、单片机,全称单片机(single-chipmicrocomputer),又称为微控制器单元MCU(microcontrollerunit)。将中央处理器、存储器、定时器/计数器、各种输入输出接口等集成在一块集成电路芯片上的微型计算机。由于发展迅速,旧的单片机定义已不能满足,因此在许多应用中被称为范围更广的微控制器;2.嵌入式系统(EmbeddedSystem),是一种嵌入式机械或电气系统,具有专用功能和实时计算性能的计算机系统。嵌入式系统通常用于有效地控制许多常见设备。嵌入式系统通常是一个完整的设备,包括数字硬件和机械组件,例如汽车中的防抱死制动系统。现代嵌入式系统通常基于微控制器(例如带有集成存储器和/或外围接口的中央处理器),但在更复杂的系统中普通微处理器(使用外部存储芯片和外围接口电路)也很常见。3、嵌入式Linux嵌入式Linux(英文:EmbeddedLinux)是一类嵌入式操作系统的总称。这类操作系统基于Linux内核,设计用于嵌入式设备。它与计算机上运行的Linux系统在本质上是一样的。虽然在功能上进行了一些剪裁,但本质上是一样的。它主要利用了Linux内核中的任务调度、内存管理、硬件抽象等功能。4、RTOS实时操作系统(real-timeoperatingsystem,RTOS)又称实时操作系统,按顺序运行,管理系统资源,为开发应用程序提供一致的基础。与一般操作系统相比,实时操作系统最大的特点就是“实时”。如果有任务要执行,实时操作系统会立即(在很短的时间内)执行任务,不会有很长的延迟。小时。此功能可确保每个任务的及时执行。3、非实时、软实时、硬实时首先,我们要明白什么是实时。实时考虑的不是速度、性能和吞吐量,而是确定性。也就是说:当一个事件发生的时候,可以确定性的保证处理多长时间?只要能满足这个要求,就可以变成硬实时。例如:操作系统1:当一个中断发生时,可以保证在1秒内到达这里,那么它是一个硬实时系统,虽然响应时间长,但是是确定性的;操作系统2:当中断发生时,几乎都能在1毫秒内完成,那么就不可能是硬系统,虽然响应时间短,但是不确定。还看到一篇文章说:软实时这种模棱两可的说法应该取消,要么实时要么非实时!操作系统包含很多功能:任务调度、内存管理、文件管理等,其中最核心的就是任务调度。这也是非实时、软实时、硬实时最大的区别。换句话说,衡量实时性的指标有:1.中断延迟:从外部事件引起的中断发生到相应中断处理程序的第一条指令被执行所经过的时间;2.任务抢占延迟时间:当一个高优先级任务就绪时,从正在执行的低优先级任务抢夺CPU资源所经过的时间;不同的操作系统有不同的任务调度机制,而这种调度机制的策略,与实际的使用场景有关。所以,没有什么好坏之分。适合的才是最好的!比如:我们的桌面系统需要考虑多任务和并发,需要同时执行多个程序。哪个程序比较慢?用户不关心,甚至没有注意到;但对于导弹控制系统来说,当外部传感器输入信号并触发事件时,必须立即执行相应的处理,否则就会延迟1毫秒,结果可能会天差地别!4.x86Linux系统调度策略我们日常使用的PC的主要目标是并行执行多个任务,强调吞吐率(执行尽可能多的应用代码),所以采用分时操作系统,并且也就是说,每个任务都有一个时间片。当分配给一个任务的时间片用完后,会自动换出(调度),然后执行下一个任务。我们平时在x86平台上编写普通客户端程序时,很少需要指定应用程序的调度策略和优先级,使用系统默认的调度机制。反之,也就是在某些必要的场合,可以设置进程的调度策略和优先级。例如在linux系统中,可以通过sched_setscheduler()系统函数设置三种调度策略:1、SCHED_OTHER:系统默认的调度策略,计算动态优先级(counter+20-nice),并将其放入时间片用完时处于就绪状态的Queuetail;2、SCHED_FIFO:实时调度策略,按照优先级进行调度,一旦CPU被占用,就会继续执行,直到放弃或者有更高优先级的任务执行;3.SCHED_RR:也是一种实时调度策略,在SCHED_FIFO的基础上增加了时间片。在执行过程中,它可以被更高优先级的任务中断。如果没有更高优先级的任务,那么当该任务的执行时间片用完后,会寻找一个相同优先级的任务执行。1、linux系统为什么是软实时的?可能有朋友会有疑问:既然Linux系统中提供了SCHED_FIFO基于优先级的调度策略,为什么不能称之为真正的硬实时操作系统呢?这是从Linux发展史说起的。Linux操作系统在设计之初就是为桌面应用而开发的。在那个时代,多个终端(电传打字机和屏幕)连接到同一台计算机主机,需要处理的是多任务和并行操作,不需要考虑实时性能,因此,Linux内核中的一些基因严重影响其实时性的因素有:(1)内核不能被抢占。内核态执行(调用系统函数时,如:write,会进入内核态执行),此时任务是不可抢占的。即使有更高优先级的任务就绪,当前任务也不能立即停止执行。相反,高优先级任务必须等待,直到当前任务返回用户态,或者当它需要在内核态等待资源并休眠时,高优先级任务才能被执行。因此,显然不能保证高优先级任务的实时性。(2)自旋锁自旋锁是用于多线程同步的锁。它用作共享资源的同步机制。线程反复检查锁变量是否可用。由于这个过程中线程一直在执行,所以是一种忙等待。一旦获得自旋锁,线程就会持有该锁,直到它被显式释放。自旋锁避免了进程上下文的调度开销,因此对于线程只会短时间阻塞的场合有效,即只适合短时间阻塞使用自旋锁。但是在自旋锁期间,任务抢占会失效。也就是说,即使自旋锁的阻塞时间很短,仍然会增加任务抢占延迟,使调度变得不确定。(3)任何时候中断的优先级最高,只要中断发生,就会立即执行中断服务程序,即中断的优先级最高。只有处理完所有的外部中断和软终端,才能执行正常的任务。这似乎是一件好事,但是想想,万一有个任务的优先级比中断高呢?如果系统在运行,网口不断接收数据,那么中断会一直执行,然后其他任务可能一直在执行,这对Linux系统的实时性是一个巨大的挑战。(4)同步运行时关闭中断如果查看Linux内核的代码,可以看到很多地方都执行了关闭中断的指令。如果在此期间发生中断,则无法保证中断响应时间。2、如何将Linux系统改为硬实时?以上所述的因素对Linux真正的实时性构成了很大的障碍,但是现实世界中确实有很多场合需要Linux具备硬实时性,因此需要针对每一种情况重点关注以上解决方案的因素。目前主流的方案有两种:单核方案:对Linux内核打补丁,解决上述问题,如:RT-Preempt;双核方案:在硬件抽象层之上运行两个内核内核:实时内核+Linux内核,分别向上层提供API函数,例如:Xenomai;这两种方案有不同的实现方式,根据研究情况,RT-Preempt和Xenomai用的比较多,下面分别来看看它们的优缺点。(1)RT-Preempt这种方法主要是给Linux内核打补丁,解决了上述问题:内核不可抢占、自旋锁、中断关闭和终端优先。至于每个问题是怎么解决的,限于篇幅,这里就不介绍了。有兴趣的朋友可以在需要的时候详细了解一下。由于直接在Linux内核上打补丁(以后肯定会合并到主分支),对于应用开发来说,操作系统向上层提供的API接口函数可以保持不变,这对于应用开发来说是非常重要的应用程序开发。是件好事。(2)XenomaiXenomai是Linux内核的实时开发框架。它希望通过无缝集成到Linux环境中,为用户空间应用程序提供全面的、接口无关的硬实时性能。下面是Xenomai的架构图:在硬件抽象层之上,有2个并行域(内核),这2个内核分别向上层提供自己的API接口函数。图中glibc是Linux系统提供的库函数,应用程序通过调用库函数和系统调用来编写程序。Xenomai也提供了相应的库函数libcobalt。这个库函数需要在用户层编译安装,就像安装第三方库一样。另外,Xenomai还参考了不同的操作系统风格,提供了几套API函数(之前的名词是:皮肤),API接口函数在这里:从图中可以看出,AlchemyAPI接口提供的函数比较完善,提供:定时器、内存管理、条件变量、事件、互斥量、消息队列、任务(可以理解为线程)等API函数。这套API函数中的具体功能与POSIX标准大致相同,在一些细节上有一些差异。由于Xenomai向应用层提供了一套独立的API函数,如果我们需要创建实时任务,就必须调用这套接口函数来创建任务,包括使用一些资源(例如:内存分配)。并且文档中也提出了一些注意事项,例如:Xenomai和Linux系统之间有些资源是不能混用的。5.RTOS的优势前面提到,Linux桌面系统的主要目标是吞吐量,单位时间内执行更多的代码。但对于单片机来说,首要目标不是吞吐量,而是确定性。因此,衡量一个实时操作系统健壮性的一个重要指标就是系统从接收到一个任务到完成任务所需的时间。也就是说,任务调度是首要考虑的。在单片机的开发中,一般有两种编程模型:基于状态机(裸运行)、基于RTOS。如果是基于状态机,就不存在任务调度问题,因为只有一个执行顺序,所有的操作都是串行执行的,唯一需要注意的控制流程就是中断处理。如果是基于RTOS的话,主要用途是任务调度,实现真正的硬实时。这方面最厉害的是VxWorks。当然,价格也很可观。有的公司买了之后,甚至会重写除任务调度模块以外的所有其他模块。这足以证明VxWorks擅长任务调度。确实很厉害,这也是它的看家本领!当然,对于简单的、需要严格控制执行顺序的关键程序,使用有限状态机的编程框架,一切尽在掌握。只要代码没有BUG,理论上所有的行为都是可控的,这也是为什么很多军事装备都使用单片机的原因!6.总结一下任务调度的问题,这是一个操作系统的重中之重,要学的东西还是很多的。最近刚买了华为鸿蒙系统背后的灵魂人物陈海波先生的新书。如果你有新的学习心得,那就分享给你吧。参考资料:https://linuxfoundation.org/blog/intro-to-real-time-linux-for-embedded-developers/https://wiki.archlinux.org/index.php/Realtime_kernel_patchsethttp://www.faqs。org/faqs/realtime-computing/faq/https://xenomai.org/documentation/xenomai-3/html/README.INSTALL/本文转载自微信公众号“IOT物联网小镇”,您可以使用下面两个二维码关注。转载本文请联系物联小镇公众号。