软件的诞生和操作系统的起源
电子技术从出现至今发展飞快,从Intel开发出第一块芯片开始,人类进入了电子信息时代。
芯片内有集成电路,使用电子信号0和1的组合表示信息,进行运算处理。
芯片有自己的指令集,不同的指令进行不同的操作,指令就是输入给芯片的0和1信号。
这些指令由程序员来设计编写,芯片通过执行这一系列指令来执行任务。
所以,最初的程序就是机器码,由CPU直接访问指令的存储地址,然后执行。
执行结果是输出的计算结果或者控制外部硬件或外设的动作。
然后程序语言升级,由汇编语言升级为C语言,更易阅读理解和编写。
这是一个庞大的产业,无数人参与其中,硬件、软件快速迭代,百花齐放。
但这也带来了问题,软件控制硬件,如果硬件改了,软件也要改。
不同的硬件配置,也需要不同的驱动程序。
自然需要制定标准,这样减少冲突,跟有利于用户和整个市场。
当标准不断完善,功能更加清晰,各个硬件外设或者软件模块发展更加成熟。
慢慢的,不断完善的底层的、支持性的软件模块组合在一起,构成了操作系统。
操作系统的目的之一,就是屏蔽硬件的差异化,使编程人员在OS之上写代码,而不用具体理解硬件的细节或差异。
这会大大提高软件的开发效率,提高软件质量,加快软件推向市场。
ARM程序的选择,Bare Metal(裸机) ,还是Linux OS?
回到ARM芯片,如果是简单的应用,直接使用裸机程序就好。
如果是很复杂的程序,就需要使用OS。
裸机程序就是程序或软件直接在硬件上运行,可以直接面对硬件进行操作。
就像单片机开发里面,GPIO、IIC、SPI等,都是用代码直接操作寄存器来完成相应的功能。包括中断也要自己处理。
内存也是自己直接分配使用,整个地址空间是透明的统一的。
这种一般都是简单的处理器芯片,Micro Controller Unit 简称MCU。
但现在的情况,这种单片机的开发,厂商都会提供开发包,里面有各种现成的各种外设操作或相关应用的参考样例,减少了开发难度。
同时,也有很多库可以使用,减少开发工作量。比如ARM-M0芯片开发时,开发IDE里就会link一个微型的标准C库,一些基本函数可以直接调用,比如字符串操作等。
在嵌入式Linux里,程序是运行在Linux Kernel之上的。
kernel是操作系统的核心,几乎控制了系统中的一切。软件和硬件的各种操作都要经过kernel。
用户一般创建的是User Space Applications, 是无法直接访问硬件,所以需要通过Kernel Space来访问硬件。
在User space中,所见的只是一大块内存和Kernel的接口。
这样做的最大好处就是user space applications是硬件无关的。
Kernel的核心职责和操作:进程管理、内存管理、进程间通信、设备驱动、电源管理等。
----------------------------------------------
使用Linux操作系统有很多好处:
1,代码安全性提高。普通单片机程序开发,写错一个控制指针或者数组操作越界,整个系统就挂掉了。
但用OS的话,有内存保护功能,不同的进程不会影响到对方的内存。
OS能够使运行的程序的一些任务在supervisor模式下运行,一些任务在用户模式下运行,权限不同,降低操作风险。
2,集成了大量的外设驱动,开发时对底层硬件的驱动控制可以不用操心或者改动很少。这样提高了程序的可移植性,上层应用程序是硬件无关的。
即使这个设备没有驱动,在OS上进行驱动开发也会容易很多,有参考模板、有可复用函数等。
3,对多线程或多进程的支持,包括优先级管理。这部分功能如果要自己实现显然很复杂并不能保证性能和稳定性。
当然也有一些RTOS系统能支持thread,这是一个选择问题,选择自己需要的、喜欢的、合适的、长期有效的技术生态(community)。
4,OS上已经实现和集成了很多可用的库,减少我们的工作量,更快更有效的完成软件开发工作。
同样,基于OS已有的库,会跟容易开发出更强的库,这样不断加强,使得选择更多,自己的应用可以借用第三方的库,减少风险提高效率。
5,Linux操作系统有很强的可裁剪性,便于不同的规模的应用选择需要的功能或模块。
6,Linux是行业通用的,应用广泛的,接受度高,生态完善,还是免费。
就比如说我正在开发个基于I2C外设的应用,MCU里要写驱动I2C外设的代码。
在硬件第一版时,要做bringup,这时如果使用Linux,就可以利用现成的I2C tools来协助检测I2C设备,读取写入I2C信息。
具体可看后面有一篇介绍Linux I2C tools的文章。
使用嵌入式Linux OS也有一些缺点:
1,相对小规模应用来讲系统太复杂了。
2,相对裸机开发来说,学习曲线太陡峭
3,对资源要求较高,运行起Linux Kernel有最小的硬件资源条件。
4,系统会不断更新升级,要注意整个Linux Kernel和相关库的版本管理。
5,相对裸机程序,Linux OS是个通用系统,内部机制为众所知,所以要注意安全和保护问题。
----------------------------------------------
裸机程序的优点:
1,性能出众。同样应用比运行LinuxOS的快大概100倍。
2,对于小规模应用,开发简单、快速。
3,可考性高。
缺点:
1,复杂度随着系统规模和功能的增加成指数级增加。
2,一些基本的或标准的函数需要自己开发,来适配相应的硬件。
3,没有多线程支持
----------------------------------------------
关于Linux OS的实时性(Real-time)
一个运行在userspace的application由内核调度,执行线程管理。
但这也意味着,如果OS需要管理其他的系统调用或进程,这个app可以被kerenl随时打断.
所以那些时间敏感的GPIO访问的应用是不适合Linux系统,需要特殊处理。
也有专门用于实时系统的Linxu扩展,比如RTLinux。
----------------------------------------------
那么问题来了,裸机程序和Linux的程序的编译有何不同?
裸机程序和Linux程序编译后的文件格式是一样的,都是基于ARM架构的可执行指令集。
主要区别在于裸机程序和Linux程序使用的C标准库不同。
一般Linux上用的C库是GNU的C标准库,glibc。如果是ARM平台则是基于ARM平台编译的glibc。
这个根据使用的编译工具链不同,也可能使用不同的基于Linux的C标准库。
而裸机程序用的C标准库可能没有,或者可能是别的库文件,比如newlib(嵌入式专用的C标准库)。
这个也是根据不同的编译器及工具链或环境,可能使用不同的标准库。
后面会就ARM使用的编译环境或工具链做说明再发个博文。