如图5-1所示,为嵌入式系统硬件模型结构,此系统主要由微处理器MPU、外围电路,以及外设组成,微处理器为ARM嵌入式处理芯片,如ARM7TMDI系列及arm9系列微处理器,MPU为整个嵌入式系统硬件的核心,决定了整个系统功能和应用领域。外围电路根据微处理器不同而略有不同,主要由电源管理模型、时钟模块、闪存FIASH、随机存储器RAM,以及只读存储器ROM组成。这些设备是一个微处理器正常工作所必须的设备。外部设备将根据需要而各不相同,如通用通信接口USB、RS-232、RJ-45等,输入输出设备,如键盘、LCD等。外部设备将根据需要定制。
嵌入式处理系统主要包括嵌入式微处理器、存储设备、模拟电路及电源电路、通信接口,以及外设电路。
1.2嵌入式系统的软件结构
嵌入式系统与传统的单片机在软件方面最大的不同就是可以移植操作系统,从而使软件设计层次化,传统的单片机在软件设计时将应用程序与系统、驱动等全部混在一起编译,系统的可扩展性,可维护性不高,上升到操作系统后,这一切变得很简单可行。
嵌入式操作系统在软件上呈现明显的层次化,从与硬件相关的BSP到实时操作系统内核RTOS,到上层文件系统、GUI界面,以及用户层的应用软件。各部分可以清晰地划分开来,如图5-2所示。当然,在某些时候这种划分也不完全符合应用要求。需要程序设计人员根据特定的需要来设计自己的软件。
板级支持包(Board Support Packet)主要用来完成底层硬件相关的信息,如驱动程序,加载实时操作系统等功能;
实时操作系统层主要就是常见的嵌入式操作系统,设计者根据自己特定的需要来设计移植自己的操作系统,即添加删除部分组件,添加相应的硬件驱动程序,为上层应用提供系统调用;
文件系统、GUI,以及系统管理主要应对需要,即如果需要文件系统及图形界面支持才需要设计,主要是为了应用程序员开发应用程序提供更多更便捷更丰富的API接口;
应用软件层即用户设计的针对特定应用的应用软件,在开发该应用软件时,可以用到底层提供的大量函数。
采用分层结构的软件设计使系统清晰明了,各个部分设计工作分工明确,从而避免整个系统过分庞大。
1.3 linux操作系统体系结构图:
1.4 linux的内核的体系结构
2 嵌入式开发的模式及流程
2.1 嵌入式系统开发模式
嵌入式系统开发分为软件开发部分和硬件开发部分。嵌入式系统在开发过程一般都采用如图5-3所示的“宿主机/目标板”开发模式,即利用宿主机(PC机)上丰富的软硬件资源及良好的开发环境和调试工具来开发目标板上的软件,然后通过交叉编译环境生成目标代码和可执行文件,通过串口/USB/以太网等方式下载到目标板上,利用交叉调试器在监控程序运行,实时分析,最后,将程序下载固化到目标机上,完成整个开发过程。
在软件设计上,如图5-4所示为结合arm硬件环境及ADS软件开发环境所设计的嵌入式系统开发流程图。整个开发过程基本包括以下几个步骤。
(1)源代码编写:编写源C/C++及汇编程序;
(2)程序编译:通过专用编译器编译程序;
(3)软件仿真调试:在SDK中仿真软件运行情况;
(4)程序下载:通过JTAG、USB、UART方式下载到目标板上;
(5)软硬件测试、调试:通过JTAG等方式联合调试程序;
(6)下载固化:程序无误,下载到产品上生产。
2.2嵌入式系统开发流程
当前,嵌入式开发已经逐步规范化,在遵循一般工程开发流程的基础上,嵌入式开发有其自身的一些特点,如图5-5所示为嵌入式系统开发的一般流程。主要包括系统需求分析(要求有严格规范的技术要求)、体系结构设计、软硬件及机械系统设计、系统集成、系统测试,最终得到最终产品。
(1)系统需求分析。确定设计任务和设计目标,并提炼出设计规格说明书,作为正式设计指导和验收的标准。系统的需求一般分功能性需求和非功能性需求两方面。功能性需求是系统的基本功能,如输入输出信号、操作方式等;非功能需求包括系统性能、成本、功耗、体积、重量等因素。
(2)体系结构设计。描述系统如何实现所述的功能和非功能需求,包括对硬件、软件和执行装置的功能划分,以及系统的软件、硬件选型等。一个好的体系结构是设计成功与否的关键。
(3)硬件/软件协同设计。基于体系结构,对系统的软件、硬件进行详细设计。为了缩短产品开发周期,设计往往是并行的。嵌入式系统设计的工作大部分都集中在软件设计上,采用面向对象技术、软件组件技术、模块化设计是现代软件工程经常采用的方法。
(4)系统集成。把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进单元设计过程中的错误。
(5)系统测试。对设计好的系统进行测试,看其是否满足规格说明书中给定的功能要求。
嵌入式系统开发模式最大特点是软件、硬件综合开发。这是因为嵌入式产品是软硬件的结合体,软件针对硬件开发、固化、不可修改。
如果在一个嵌入式系统中使用Linux技术开发,根据应用需求的不同有不同的配置开发方法,但是,一般情况下都需要经过如下的过程。
(1)建立开发环境,操作系统一般使用Redhat Linux,选择定制安装或全部安装,通过网络下载相应的GCC交叉编译器进行安装(比如,arm-1inux-gcc、arnl-uclibc-gcc),或者安装产品厂家提供的相关交叉编译器;
(2)配置开发主机,配置MINICOM,一般的参数为波特率115200 Baud/s,数据位8位,停止位为1,9,无奇偶校验,软件硬件流控设为无。在Windows下的超级终端的配置也是这样。MINICOM软件的作用是作为调试嵌入式开发板的信息输出的监视器和键盘输入的工具。配置网络主要是配置NFS网络文件系统,需要关闭防火墙,简化嵌入式网络调试环境设置过程。
(3)建立引导装载程序BOOTLOADER,从网络上下载一些公开源代码的BOOTLOADER,如U.BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等,根据具体芯片进行移植修改。有些芯片没有内置引导装载程序,比如,三星的ARV17、arm9系列芯片,这样就需要编写开发板上FLASH的烧写程序,读者可以在网上下载相应的烧写程序,也有Linux下的公开源代码的J-FLASH程序。如果不能烧写自己的开发板,就需要根据自己的具体电路进行源代码修改。这是让系统可以正常运行的第一步。如果用户购买了厂家的仿真器比较容易烧写FLASH,虽然无法了解其中的核心技术,但对于需要迅速开发自己的应用的人来说可以极大提高开发速度。
(4)下载已经移植好的Linux操作系统,如MCLiunx、arm-Linux、PPC-Linux等,如果有专门针对所使用的CPU移植好的Linux操作系统那是再好不过,下载后再添加特定硬件的驱动程序,然后进行调试修改,对于带MMU的CPU可以使用模块方式调试驱动,而对于MCLiunx这样的系统只能编译内核进行调试。
(5)建立根文件系统,可以从http://www.busy.box.net下载使用BUSYBOX软件进行功能裁减,产生一个最基本的根文件系统,再根据自己的应用需要添加其他的程序。由于默认的启动脚本一般都不会符合应用的需要,所以就要修改根文件系统中的启动脚本,它的存放位置位于/etc目录下,包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等,自动挂装文件系统的配置文件/etc/fstab,具体情况会随系统不同而不同。根文件系统在嵌入式系统中一般设为只读,需要使用mkcramfs genromfs等工具产生烧写映像文件。
(6)建立应用程序的FLASH磁盘分区,一般使用JFFS2或YAFFS文件系统,这需要在内核中提供这些文件系统的驱动,有的系统使用一个线性FLASH(NOR型)512KB~32MB,有的系统使用非线性FLASH(NAND型)8MB~512MB,有的两个同时使用,需要根据应用规划FLASH的分区方案。
(7)开发应用程序,可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中,有的应用不使用根文件系统,直接将应用程序和内核设计在一起,这有点类似于μC/OS-II的方式。
(8 ) 烧写内核、根文件系统和应用程序,发布产品。
以上内容仅仅作为学习用。