为什么航天器导弹的控制系统都用单片机而不是嵌入式系统

一、前言

二、关于单片机与嵌入式系统之间界定

1. 单片机

2. 嵌入式系统

3. 嵌入式 Linux

三、非实时、软实时、硬实时

四、x86 Linux 系统的调度策略

1. 为什么 Linux 系统是软实时?

2. Linux 系统如何改造成硬实时?

(1) RT-Preempt

(2) Xenomai

五、RTOS 的优势

六、总结

一、前言

前几天和一个在某研究所的发小聊天,他说:现在的航空、航天和导弹等武器装备中,控制系统几乎都是用单片机,而不是嵌入式系统。

乍一听,和我们的直觉有矛盾啊:那么高大上的设备,其中的控制逻辑一定很复杂,不用嵌入式系统怎么来完成那么复杂的功能控制啊?然后仔细了解了一下,才明白答案是:安全+可控。

这篇文章我们就来聊一下关于单片机与嵌入式、操作系统与 RTOS 之间的那些事!通过这篇文章,让你操作系统的实时性有一个系统、全面的理解!

二、关于单片机与嵌入式系统之间界定

说实话,关于它俩的区分,没有人可以给出一个标准的、正确的答案。每个人理解的单片机与嵌入式系统,都是略有差别的。

抛开硬件,从应用程序开发的角度来看,我是这样来理解的:

单片机:可以直接使用状态机来实现程序框架,也可以利用一些 RTOS(ucOS、FreeRTOS、vxWorks、RT-Thread)等来完成一些调度功能。

嵌入式系统:利用嵌入式 Linux 操作系统以及一些变种来编写应用程序。

我知道自己的理解可能是不对的,至少不严谨、范围狭隘,既然没有标准答案,那姑且引用维基百科中的定义吧,毕竟概念是死的,更重要的是我们如何根据实际的需要来进行选择。

1. 单片机单片机,全称单片微型计算机(single-chip microcomputer),又称微单元 MCU(microcontroller unit)。把中央处理器、存储器、定时/计数器、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机。由于其发展非常迅速,旧的单片机的定义已不能满足,所以在很多应用场合被称为范围更广的微;

2. 嵌入式系统嵌入式系统(Embedded System),是一种嵌入机械或电气系统内部、具有专一功能和实时计算性能的计算机系统。嵌入式系统常被用于高效控制许多常见设备,被嵌入的系统通常是包含数字硬件和机械部件的完整设备,例如汽车的防锁死刹车系统。现代嵌入式系统通常是基于微(如含集成内存和/或外设接口的中央处理单元)的,但在较复杂的系统中普通微处理器(使用外部存储芯片和外设接口电路)也很常见。

3. 嵌入式Linux嵌入式Linux(英语:Embedded Linux)是一类嵌入式操作系统的概称,这类型的操作系统皆以Linux内核为基础,被设计来使用于嵌入式设备。与电脑端运行的linux系统本质上是一样的,虽然经过了一些功能上的裁剪,但是本质上是一样的,主要利用 Linux 内核中的的任务调度、内存管理、硬件抽象等功能。

4. RTOS实时操作系统(RTOS),又称即时操作系统,它会按照排序运行、管理系统资源,并为开发应用程序提供一致的基础。实时操作系统与一般的操作系统相比,最大的特色就是“实时性”,如果有一个任务需要执行,实时操作系统会马上(在较短时间内)执行该任务,不会有较长的延时。这种特性保证了各个任务的及时执行。

三、非实时、软实时、硬实时

首先要明白什么叫实时性?实时性考虑的不是速度、性能、吞吐量,而是确定性,也就是说:当一个事件发生的时候,可以确定性的保证在多长时间内得到处理,只要能满足这个要求,就可以成为硬实时。比如:

操作系统1:当中断发生时,可以保证在 1 秒内得到这里,那么它就是硬实时系统,虽然响应时间长,但它是确定的;操作系统2:当中断发生时,几乎都可以在 1 毫秒内完成,那么那就不能成为硬实系统,虽然响应时间短,但是它不确定。

也看到有文章说:应该取消软实时这个模棱两可的说法,要么是实时,要么是非实时!

操作系统包含的功能很多:任务调度、内存管理、文件管理等等,其中最核心的就是任务调度,这也是非实时、软实时、硬实时的最大区别。

也就是说,衡量实时性的指标就是:

1. 中断延时:一个外部事件引发的中断发生时,到相应的中断处理程序第一条指令被执行时,所经过的时间;

2. 任务抢占延时:当一个高优先级的任务准备就绪时,从正在执行的低优先级任务中抢夺 CPU 资源所经过的时间;

不同的操作系统,其任务调度机制也是不一样的,而这个调度机制的策略,又是与实际的使用场景相关的。因此,并不存在哪个好、哪个不好这样的说法,合适的就是最好的!

比如:我们的桌面系统,需要考虑的是多任务、并发,需要同时执行多个程序,哪个程序慢一点,用户无所谓,甚至觉察不到;但是对于一个导弹控制系统,当一个外部传感器输入信号,触发一个事件时,对应的处理必须立刻执行,否则耽搁 1 毫秒,结果可能就是差之千里!