探讨嵌入式软件开发方向的前景和趋势

        软件开发是当前一个很热门的话题,可是你知道软件开发岗位都有哪些吗?其中又有什么联系呢?本文以软件开发的嵌入式方向,来聊聊这个问题。

f466e7d3166146da9de677b357ea1f59.png

Linux IO(基本输入/输出)系统架构图

         如果说互联网系统像一个以服务器为中心的星型,大数据系统像一个流水线那么嵌入式系统更像一套层层叠叠积木。嵌入式软件的开发职能往往也是以层去区分。上图是Linux IO系统的基本框图,IO即基本输入输出系统,linux还有很多其他系统,如蓝牙系统、WIFI系统、显示系统、存储系统等等。每个系统都有这样一套从下到上的分层结构。

        1、最下面的是硬件层,即图中的Hardware。图中的STM32是个高性能单片机(还记得单片机吗?将CPU、RAM、ROM和一些控制器包含在内),其外部引脚根据自身特性连接对应的外部电子器件,如DAC(数模转换控制器)外部连接了Analog device(模拟器件)作为输出。ADC(模数转换控制器)也连接了Analog device作为输入。之所以可以判断出是作为输入还是输出,是因为STM32是单片机,内部肯定是数字信号。在硬件设计过程中需要考虑芯片选型、电路板设计、布线走向、功率负荷、电磁干扰等因素,完成这些工作的是硬件工程师此外嵌入式设备往往是个终端设备,负责设计这个终端电路板、外形外壳等器件的就是结构工程师

        2、再往上是内核层,即图中的Kernel space。包括驱动(drivers)、内核核心(进程管理、内存分配等核心工作)、框架(framework)、面向应用接口层(user(kernel))。驱动程序是直接控制硬件的软件程序,之前的《电子设计之软件初探》文中有介绍过,单片机最终以引脚输出高低电平(0V~3.3V/5V)来操作外部硬件,驱动程序就是直接控制引脚按照什么规律输出哪种电平的程序,其对应开发岗位为驱动工程师。内核核心我们一般不需要进行开发,除非一些特殊需求,对内核核心做出改动的开发人员为内核工程师。对于复杂度不高的嵌入式系统,框架层和面向应用接口层相对简单,工作量较少,通常由内核工程师或驱动工程师顺带完成。对于复杂度较高的嵌入式系统(如Android系统),则由专门的框架工程师或中间件开发工程师负责完成。

        3、最上面是应用层,即图中的User space。在说应用层之前,先来看两个图中没有的系统:文件系统和显示系统(GUI)。计算机世界可以理解为从现实世界抽象出一个虚拟世界。硬件当然属于现实世界,而软件可以认为是虚拟世界。怎么样抽象的呢?操作系统是对CPU及其运行时相关资源的抽象,操作系统主要管理进程,而进程就是抽象出来了一个虚拟的CPU,供应用程序使用。这就是为什么我们用电脑时可以听着歌、看着电影、聊着天。因为你的电脑上安装了操作系统,从一个真是的CPU(指单核情况,多核时是真的有多个物理“CPU”),抽象出来了多个CPU。如果电脑没有安装操作系统,单核多任务万万做不到的。而文件系统则是对磁盘的抽象,显示系统是对显示器的抽象

        4、文件系统:即使已经有驱动程序,应用直接通过驱动去操作磁盘仍旧是非常麻烦的,比如读取一个数据,你需要知道从磁盘的哪个磁道、哪个位置、读取多长,然后操作读取。这么干的话,简单地操作个文件,开发人员估计都能疯掉。而有了文件系统之后,问题就简单多了,我只需要知道文件在哪个目录下、文件名是啥,就可以很方便的操作这个文件。至于是怎么读写磁盘的,文件系统全部帮你屏蔽掉了。著名的文件系统如:NTFS、FAT32、exFAT、yaffs2(嵌入式常用)。

        5、显示系统:同理,如果直接去操作LCD显示器也是极其繁琐的工作,尤其是显示的复杂度越来越高,应用开发人员不可能直接面向系统原生接口编程。于是就出现了图形用户界面系统(GUI),GUI提供了丰富的元素来开发用户界面,至于怎么操作LCD显示器,GUI系统都给屏蔽掉了。界面开发的时候面向GUI编程就可以了,GUI负责去调用原生接口。著名的嵌入式系统GUI如:QT、KanZi、MiniGUI。

        6、应用开发:应用层主要实现业务代码。根据需求,嵌入式开发也可以不使用操作系统,直接在驱动层之上建立中间件层(就是封装一些常用的接口),再上面就是应用层了。无操作系统的这类开发也被称为单片机开发,对应单片机开发工程师。嵌入式操作系统有很多种,如小型实时操作系统UCOS、VXwork、ucLinux等,这些系统通常不使用GUI。即使Linux系统,有时候也不使用GUI。这种场景下应用的主要功能就是长期驻留在系统后台运行。这种应用常由C和C++开发完成,对应岗位直接称为嵌入式软件开发工程师。而对于使用GUI的嵌入式系统来说,除了需要开发那些驻留系统后台的应用,还需要开发图形用户交互应用,根据GUI的不同,其岗位也有多种,如QT开发工程师、Kanzi开发工程师等。

82687c12e46b4817815dfa9d3e4aade4.png

Android系统官方架构图

         上面主要介绍了嵌入式Linux软件开发,再来看看Android系统,Android是Linux衍生系统,广义上来说属于Linux系统的一种。在《浅谈软件开发方向之互联网》一文中提到过,Android系统开发和Android应用开发差别还是比较大的。上图是Google官方提供的Android系统架构图。Android应用开发人员开发的APP在上图中并没有体现,上图最顶层的System Apps,指的是Launcher(桌面)、SystemUI(状态栏、导航栏、快速设置等)、电话、短信、相机等内置的系统应用。开发人员另外开发的属于第三方应用,和系统应用平级,但在系统内部的存储位置不同,权限也不同。所以三方应用可以卸载,系统应用卸不了。可以看到Android系统架构最底部也是Linux Kernel,所以硬件层、驱动层、内核核心的开发步骤和Linux是一样的。下面我们重点来看看它的特别之处。

        1、HAL层:硬件抽象层,为什么多了这么个玩意呢?主要有两个原因:一是对驱动做了再次封装,对Framework层提供统一接口,硬件厂商或或开发人员只需要面向HAL框架编程即可。二是HAL属于用户空间,Linux驱动属于内核空间,内核空间代码遵循GPL协议,必须开源。而用户空间遵循Apache协议,可以不开源。硬件厂商可以只在驱动层做简单的芯片寄存器映射,主要逻辑放在HAL层实现,更好的保护自身利益。在Android系统开发中,该层常和驱动层一起开发,由HAL开发工程师负责

        2、Framework Native层:使用C++和C实现,对下操作HAL层的硬件接口,向上通过Native和Framework Java层连接在一起。

        3、Framework Java层:即Android Develop SDK,使用JAVA实现,对应用层提供调用接口,对下通过Native与Framework Native层连接在一起。负责Framework层开发的为Framework开发工程师或框架工程师。Android Framework是极其庞大复杂的,包含各种子系统的服务、策略、路由、调度等所有代码。所以做Android系统开发的大型公司常按照子系统重新组织团队,如蓝牙子系统、WIFI子系统、Audio子系统、Camera子系统、显示子系统。每个团队负责一个子系统从硬件到应用的垂直研发。

        4、Android的GUI系统:Android的GUI系统并没有直接用那些知名GUI,而是是基于OpenGL/EGL来定制实现的。

        5、应用层:即APP开发,常使用Java、Kotlin进行开发,编译出apk文件安装在Android系统上。需要注意的是,当Android系统为定制化系统时,framework和Android原生SDK很可能是不一样的,需要找到系统被修改后编译出的framework的jar包,替代Android Develop SDK进行开发。

        现在的大多数嵌入式设备都具有联网功能,作为一个智能网络终端,接入到互联网中,和互联网系统、大数据系统一起,形成了一个更庞大更复杂的系统,也造就了我们日益智能化、网联化的生活。

 

物联沃分享整理
物联沃-IOTWORD物联网 » 探讨嵌入式软件开发方向的前景和趋势

发表评论