初学嵌入式开发的同学,经常面临嵌入式学习是从裸机开发入手还是从嵌入式Linux入手,二者有何差异的困扰。那我们今天就来从软件开发的角度来聊聊二者的区别。
我们来看什么是嵌入式Linux开发和裸机开发的概念。电子技术从出现至今发展飞快,从Intel开发出第一块芯片开始,人类进入了电子信息时代。芯片内有集成电路,使用电子信号0和1的组合表示信息,进行运算处理。芯片有自己的指令集,不同的指令进行不同的操作,指令就是输入给芯片的0和1信号。这些指令由程序员来设计编写,芯片通过执行这一系列指令来执行任务。所以,最初的程序就是机器码,由CPU直接访问指令的存储地址,然后执行。执行结果是输出的计算结果或者控制外部硬件或外设的动作。然后程序语言升级,由汇编语言升级为C语言,更易阅读理解和编写。软件控制硬件,如果硬件改了,软件也要改。不同的硬件配置,也需要不同的驱动程序,这样的冲突需要通过制定标准来减少,当标准不断完善,功能更加清晰,各个硬件外设或者软件模块发展更加成熟。慢慢的,不断完善的底层的、支持性的软件模块组合在一起,构成了操作系统。操作系统的目的之一,就是屏蔽硬件的差异化,使编程人员在OS之上写代码,而不用具体理解硬件的细节或差异。这会大大提高软件的开发效率,提高软件质量,加快软件推向市场。所谓的裸机开发指的就是在你的开发板上不跑任何操作系统,直接面向硬件编程,而嵌入式Linux开发指的就是在开发板上运行Linux系统,在此基础上进一步做软件开发。
实际开发项目中到底是选择嵌入式Linux还是裸机开发呢?如果实现的业务逻辑比较简单,直接使用裸机编程就好了,如果应用业务逻辑很复杂,就需要使用OS了,一般在嵌入式OS中Linux系统得到了最为广泛的使用。
裸机程序就是程序或软件直接在硬件上运行,可以直接面对硬件进行操作。就像单片机开发里面,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的优缺点。使用嵌入式Linux操作系统有着诸多的好处:
代码安全性提高。普通单片机程序开发,写错一个控制指针或者数组操作越界,整个系统就挂掉了。但用OS的话,有内存保护功能,不同的进程不会影响到对方的内存。OS能够使运行的程序的一些任务在supervisor模式下运行,一些任务在用户模式下运行,权限不同,降低操作风险。
集成了大量的外设驱动,开发时对底层硬件的驱动控制可以不用操心或者改动很少。这样提高了程序的可移植性,上层应用程序是硬件无关的。即使这个设备没有驱动,在OS上进行驱动开发也会容易很多,有参考模板、有可复用函数等。
对多线程或多进程的支持,包括优先级管理。这部分功能如果要自己实现显然很复杂并不能保证性能和稳定性。当然也有一些RTOS系统能支持thread,这是一个选择问题,选择自己需要的、喜欢的、合适的、长期有效的技术生态。
OS上已经实现和集成了很多可用的库,减少我们的工作量,更快更有效的完成软件开发工作。同样,基于OS已有的库,会跟容易开发出更强的库,这样不断加强,使得选择更多,自己的应用可以借用第三方的库,减少风险提高效率。
Linux操作系统有很强的可裁剪性,便于不同的规模的应用选择需要的功能或模块。
Linux是行业通用的,应用广泛的,接受度高,生态完善,还是免费。
当然事务都是两面性的,使用嵌入式Linux OS也有一些显而易见的缺点:
相对小规模应用来讲系统太复杂了。
相对裸机开发来说,学习曲线太陡峭
系统会不断更新升级,要注意整个Linux Kernel和相关库的版本管理。
相对裸机程序,Linux OS是个通用系统,内部机制为众所知,所以要注意安全和保护问题。
裸机开发的优缺点正好与嵌入式Linux开发相反。比如裸机存在着同样硬件条件下代码执行效率更高,小规模应用开发简单、快速,可靠性更高等优点。同样的随着软件规模和功能的增加其开发的复杂度成指数级上升,没有对多线程的支持也会使得实现复杂业务逻辑显得可望不可及。
从就业的岗位上来看嵌入式Linux开发是当前嵌入式领域中非常热门和重要的一个方向,相关岗位有:
嵌入式Linux驱动工程师:主要负责针对特定硬件平台,开发和优化驱动程序,以便与硬件设备通信,并实现更好的性能和稳定性。
嵌入式Linux应用开发工程师:主要负责设计和实现嵌入式应用程序,如物联网终端、智能家居系统、智能交通系统等。
嵌入式系统架构师:主要负责整个嵌入式系统的软硬件架构设计、方案评估、平台选择、资源协调等相关工作。
嵌入式解决方案工程师:主要负责结合客户需求、技术资源和市场情况,为客户提供完整的嵌入式解决方案,包括硬件选型、软件支持、系统集成等。
裸机开发是嵌入式领域中的关键技术之一,相关岗位有:
嵌入式软件工程师:负责开发和维护裸机程序,在没有操作系统支持的情况下针对特定硬件平台进行开发。
嵌入式硬件工程师:负责开发和维护硬件电路设计,为嵌入式设备提供数据采集、存储等基础功能支持。
嵌入式系统架构师:负责整个嵌入式系统的软硬件架构设计、方案评估、平台选择、资源协调等相关工作。
嵌入式系统优化工程师:负责优化系统性能和功耗,并针对系统限制优化算法,缩小代码和内存占用。
嵌入式应用开发工程师:主要负责嵌入式应用程序的设计和实现,如智能家居控制器、自动驾驶汽车控制器等。
给初学者的建议。建议小白学员可以从裸机开发入手,它的学习难度较低,可以更直接的体会到软件控制硬件、软硬件协同工作的过程。在短期内就可以完成一些简单功能开发,提高学习兴趣,为后续嵌入式Linux环境下软件开发打下坚实基础。而嵌入式Linux开发由于学习周期长,技术要求高,更容易拿到更高的薪资待遇,是小白学员学习的追求的终极目标。^_^