浅谈软件开发方向之嵌入式

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

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进行开发。

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

 

  • 9
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
嵌入式MCU软件开发中,中断是非常重要的一种机制,可以有效地处理硬件外设的状态变化,提高系统响应速度和效率。在中断处理过程中,中断优先级和中断嵌套是需要考虑的两个重要问题。 中断优先级是指当多个中断同时发生时,系统按照一定的优先级顺序来处理这些中断。一般来说,系统有多个硬件外设,每个外设都会产生中断,中断的优先级高低可以通过设置相应的寄存器来实现。在中断处理过程中,如果当前正在处理一个中断,而此时又有一个优先级更高的中断发生,系统会立即中断当前中断的处理,转而去处理优先级更高的中断,这就是中断优先级的作用。 中断嵌套是指在处理一个中断的过程中,又发生了另一个中断。这种情况下,系统需要先处理当前正在处理的中断,再去处理发生的新中断。为了实现中断嵌套,系统需要有一个中断嵌套的机制,一般来说,这个机制是通过设置一个中断屏蔽寄存器来实现的。当一个中断正在处理时,系统会将该中断的优先级设置为最高,然后将其他中断的优先级都设置为低于当前中断的优先级,这样可以保证当前中断处理完毕后,仍然按照优先级顺序来处理其他中断。 在实际的嵌入式MCU软件开发中,中断优先级和中断嵌套是需要根据具体应用场景来设置的。如果系统中有多个硬件外设,可以根据外设的性质和重要程度来设置中断优先级。如果系统需要支持中断嵌套,需要考虑中断处理的顺序和优先级,以保证系统的稳定性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值