嵌入式系统简单介绍(入门)

嵌入式系统简单介绍(入门)

嵌入式操作系统是一种运行在嵌入式相关产品中的操作系统,它的主要作用是负责任务的调度,内存的分配以及数据的存储等。常见的嵌入式产品有手机,平板,自助取款机,收银台结算机等等。嵌入式操作系统为用户程序提供了丰富的接口,如设备的驱动接口、通信接口、图形接口等,这就大大的方便了应用程序的开发,使得嵌入式产品的可靠性、实用性、用户体验等都大大提升。以下几款系统是常见的嵌入式操作系统,uCOS-II,嵌入式 Linux,风河 Vxworks,微软 WINCE 等。

嵌入式系统的软件架构

在进行一款产品的设计时可以选择使用操作系统,也可以选择不使用操作系统。在不使用操作系统的程序设计中,应用软件的开发一般会涉及到芯片寄存器,定时器,外部中断,存储地址等与硬件相关的特性。这就要求软件的开发人员对底层硬件有较
好的理解。而嵌入式操作系统通过对软件架构进行了层次划分,应用程序的开发人员
只需要关心与项目功能相关的代码,负责任务功能的实现,不必关心硬件底层的信息,
这在某种程度上屏蔽了底层硬件对开发人员的限制,同时这种设计也使应用软件的移
植性有了提高。同时,底层软件设计人员,不必关心项目的功能,只要提供给上层调
用硬件的接口函数即可。对嵌入式操作系统的软件设计来说,一般会将其分为多个层
次,这里将其进行四个层次的划分,分别是:设备驱动层、内核层、应用接口层、应
用层。

在进行产品设计时,由于产品的功能不同,所采用的硬件也不同。因此,软件部分的设计会根据硬件进行一些裁剪。对于那些功能比较简单,使用低端单片机就可以实现的设计,完全没有必要采用操作系统,其一般只包括驱动层和应用层。对于复杂的项目设计,则需要采用操作系统来进行项目的设计,而且这也是科技发展的必然趋势。下面将分别介绍操作系统的各个层次。

驱动层
驱动层是由三个部分所组成的:硬件抽象层(HAL)、板级支持包(BSP)和驱动程序。驱动层的功能是对硬件信息进行屏蔽,为上层提供统一的软件接口,使得上层的应用开发无需关心具体的硬件组成,有利于开发过程中相关人员的任务分配。

由于完成的项目不同,所采用的硬件设备也不完全一样,因此同样的操作系统在不同的项目中需要对硬件相关的代码进行重新编写,这在无形之中增加了系统移植的难度,为了解决这个问题增加了硬件抽象层(HAL)。硬件抽象层实质上是一种硬件的 API 接口,将这些接口提供给系统和上层应用来使用。硬件抽象层的工作主要是进行硬件的初始化包括定时器、串口、中断等,配置 I/O 及通信方式[12]。硬件抽象层将操作系统内核、上层的应用程序与硬件进行完全的隔离,方便了系统内核代码和应用程序的移植工作。
HAL对硬件进行了抽象表述,给出了其 API 的定义,但是不给出具体的编码实现。通常底层硬件实现 HAL 的各种功能是以 BSP 的形式来完成的。底层硬件和操作系统之间的连接是通过板级支持包来实现的,是 HAL 的具体实现形式,所以有些人也称 BSP 层为 HAL[
13]。硬件相关寄存器,存储器,I/O 接口等的实现主要是通过 BSP实现的,其为操作系统的调用奠定了底层的基础。

BSP 的特点有:硬件相关性,BSP 程序直接关联与项目采用的具体硬件,不同的硬件具有不同的板级支持包;操作系统相关性,由于当前的市场上有多种操作系统的存在,且每个操作系统与硬件之间定义的接口不同,因而其实现方式各异[14]。板级支持包需要根据操作系统定义的接口来实现,因而在进行 BSP 编程时一般采用的方式是在一定的模板上进行修改,而非重新编写。
设备驱动程序通常指的是在操作系统中的驱动程序,一般以模块的方式封装在操作系统中,为上层的应用提供设备接口,同时会使用 BSP 提供的函数来实现对硬件的操作。总之,驱动层是系统和硬件之间的结合,对系统性能的提高起着十分重要的作用[15]。

内核层
内核并不是一个操作系统,只是操作系统的一部分,但却是最为重要的一部分,是操作系统的核心。操作系统中的任务调度,内存管理,磁盘管理等,都和系统的内核有着密切的关系。拥有的内核不同,则操作系统的名称也不同,例如基于 Linux 内核的操作系统叫 Linux 系统,基于 wind 内核的操作系统是 Vxworks 系统等[16]。

内核作为操作系统的核心,拥有着最高的权限。通常应用程序不允许直接和底层进行交互,以防止出现系统瘫痪。系统内核是应用和底层硬件的媒介,应用要完成一定的功能必须要有硬件的支持,因此内核通过调用应用程序来获取应用任务,同时内核通过调用系统的驱动程序,去实现相应的功能。通常为了保证工作时系统的稳定可靠,编写的应用程序不能修改系统的内核文件。

实际上应用程序可以不通过操作系统来调用底层硬件,在低端单片机程序的开发中,往往是应用程序直接调用底层的寄存器,I/O 接口等来完成相应的操作。但是,随着微处理器技术的发展,使用微处理器完成的项目越来越复杂,同时对所开发产品的可靠性、实时性、移植性等提出的要求越来越高。因此,带有操作系统的嵌入式应用会越来越普及。

应用程序接口层
在嵌入式操作系统的设计中,应用层和内核层相互之间会用接口进行交互并提供服务,其中应用层与内核之间的接口称之为应用程序接口(API)。API 实际上是一种功能集合,也可说是定义、协议的集合,无论是哪种集合,它的实质都是通过抽象为用户屏蔽实现上的细节和复杂性。从用户角度看应用程序接口,表现为一系列的 API函数,用户可以使用这些函数进行应用程序的开发。从用户角度看,应用程序接口给用户提供了一组方法,用户可以使用这组方法向内核层发送业务请求、信息和数据,内核层在根据相应的数据进行相关硬件的调用,从而完成相应的业务请求。

应用程序层
应用程序层通常为用户编写的为了实现某种功能的任务程序,可以只有一个任务也可以有多个任务。这些程序的编写和具体的硬件无关,无需考虑硬件的差异,因此应用层的程序便于移植,程序编写人员无需了解具体的底层实现,这就使得应用程序的开发门槛大大降低,同时减少了工作量。应用程序是和完成的具体任务相关的一部分程序,也是项目开发人员最需要关心的一部分程序。这部分程序的设计直接影响到系统的功能能否正确的实现。因此,在项目开发中,要把主要工作放在这一层进行。

常见的嵌入式实时操作系统
Vxworks
VxWorks 的提供商是美国的风河公司,它同时提供了一套集成开发环境 Tornado,
界面有点类似微软的 Visual Studio,但是有更加强大的调试和仿真功能,便于调试和
修改[17]。Vxworks 之所以能在嵌入式系统中广泛应用,与其良好的架构设计,友好的
开发环境等是分不开的。由于其系统的可靠性,它已经被广泛应用在包括航空、航天、
军事等众多领域。Vxworks 的组成涉及到进程、存储、设备、文件等的管理,以及网
络协议。其内核 wind 具有可靠的任务管理和实时切换,从而保证了系统的可靠运行。
优点:系统采用了高性能的操作系统实时内核,稳定可靠。同时,由于风河公司
的服务支持完善,便于问题的快速解决。
缺点:开发环境中的项目(Project)管理能力不足,Vxworks 技术支持上仍比较欠
缺,并且 Vxworks 属于商业软件,不提供源代码,不便于进行相应的更改。

uClinux
uClinux 是对桌面 Linux 进行相应的剪裁修改后,应用到嵌入式领域的一款 Linux
系统[18]。为了将桌面的 Linux 系统应用到嵌入式领域,Lineo 公司对其进行了大量的
修改,使得其代码量更低,实时性得到了增强。
Linux 操作系统是一种开源的操作系统,由于其可以免费使用,且十分稳定,已
经广泛应用在服务器领域中。随着嵌入式产品的使用需求的提高,因此对嵌入式 Linux
的需求不断加大。而 uClinux 正是在此基础上,通过对 Linux 系统进行相应的裁剪,
优化,进而产生的一个具有实时性的嵌入式系统。虽然经过剪裁的 uClinux 代码量很
小,但是基本上保持了原有 Linux 的所有基本功能。由于 Linux 的开源性,因此大部
分基于 GNU 的软件基本上可以不需改动或者稍加修改后即可运行在 uClinux 上。
优点:保持了 Linux 系统的稳定可靠,拥有丰富的 API 接口函数,良好的代码移
植性,软件代码开源。
缺点:由于 Linux 本身是为桌面系统而设计,虽然嵌入式 Linux 进行了很多的改
进,但实时性上并不是很高。

uCOS-II
uCOS-II 系统是随着嵌入式的发展而产生的。uCOS-II 系统中九成以上的代码是采用标准的 C 语言编写的,其余一部分代码与硬件紧密相关是由汇编编写[19]。由于汇编语言晦涩难懂,作者将其缩小到了最小量,以便于在其他的 CPU 上进行系统的移植工作。用户只需要有标准的 ANSI 的 C 语言集成开发环境套件工具集就可以将uCOS-II 系统嵌入到所要研发的项目产品中。uCOS-II 系统在执行效率、占用空间、实时性和可扩展性等方面有着显著的优点。其主要特点如下:
(1)开源性。uCOS-II 系统的源代码全部公开,官方网站提供了相应的下载链接,
并且有部分微处理器的移植示例。这样就使系统变得开放、透明,极大地方便了uCOS-II 系统的开发,提高了开发效率。
(2)移植性。由于其大部分采用的是国际标准的 ANSI C 语言进行编码,只有和底层部分相关的是用汇编语言写的。如果处理器能够进行堆栈处理,编码指令中有压栈、出栈指令,并且所采用的开发环境支持 C 语言内嵌汇编代码,那么 uCOS-II 系统就能移植到该处理器中。
(3)可固化。uCOS-II 是针对嵌入式而开发的,代码小巧,编译后只有几十 K,因此可以固化到 Flash 内。
(4)可剪裁。用户可以根据自身需要,对不需要的代码进行屏蔽处理,而且这是通过宏实现的,操作方便。
(5)抢占式。在非中断条件下,首先执行最高优先级任务。
(6)多任务。不同优先级任务可以设置 64 个。
(7)可确定性。每个任务的运行时间确定,从而保证了系统的可靠。
(8)独立的栈。为每个任务划分独立的栈空间,并且每个栈空间的大小是可以
不同的,更加灵活。
(9)中断。中断的嵌套被良好的支持,最多可以进行 255 层的中断嵌套。在中
断退出前会检测是否有更高优先级的任务已经就绪,如果已经就绪就执行更高优先级
任务,否则返回原来的任务去执行。
比较以上较为成熟且广泛使用的嵌入式实时操作系统,可以发现,各个操作系统分别具有各自的特点。而 uCOS-II 操作系统具有体积小,源代码开源,可移植性高,实时性好等特性,针对研究课题的需求与硬件条件的限制,应该选择一款稳定性好,可靠性高,且已经广泛使用的系统,因此决定在 uCOS-II 的基础上进行软件的开发。

uCOS-II 系统是运行在一定的硬件平台上的,并不是所有的处理器均可以正常运行它,它的运行需要以下条件:处理器拥有定时器,可以产生定时中断,以保证系统运行的时钟节拍。使用 C 语言可以编写中断打开和关闭的函数,便于处理临界区代码。处理器拥有压栈出栈指令,方便寄存器的堆栈处理。
系统代码移植过程的具体描述如下。
文件分布
从官网下载所要移植版本的 uCOS-II 源代码,对其进行解压整理,并进行相应的分类后,形成如图2.2的文件分布图。其中 Config 文件夹中的内容为配置文件,里面包含的是使用宏定义的与配置相关的头文件。Driver 文件夹里面存放的是和 MMU 驱动相关的文件,Includes中包括了系统所需的相关头文件,Interrupt 文件夹中为中断相关的代码文件,MainFun 为应用程序相关文件的文件夹,Startup 为汇编编写的启动文件。uC_Core 中为 uCOS-II 系统中不需要任何改动的源码和需要进行相应移植的3个源文件 os_cpu.h, os_cpu_c.c, os_cpu_a.s[20]

转自:基于嵌入式操作系统的无人机自动驾驶仪设计及自抗扰算法研究[D]. 北京理工大学, 2016.

你可能感兴趣的:(嵌入式系统简单介绍(入门))