您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 嵌入式系统设计-李秀娟-课件-第5章
1第5章嵌入式开发环境的建立在熟知的环境里奔跑,可以随心所欲。2本章内容5.1嵌入式系统的开发模式与设计流程15.2嵌入式Linux开发流程25.3嵌入式系统开发环境的建立35.4BootLoader45.5Linux的根文件系统453简介无论你是否做过嵌入式系统的开发,开发环境的建立都是开发者要做的第一件事情。本章向你讲述如何利用已有知识进行嵌入式系统的开发,介绍嵌入式系统的设计、开发流程和具体操作步骤,以及如何构建嵌入式系统的开发环境。45.1嵌入式系统的开发模式与设计流程嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件开发平台上编写软件是非常困难的。目前一般采用的解决办法是首先在软硬件资源比较丰富的通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。也就是我们通常所说的构建“宿主机/目标机”的交叉开发环境,“在谁的上面编写运行在谁上的程序的问题”。5.1.1嵌入式系统开发模式交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用“宿主机+目标机+调试通道”的模式,如图所示。5在采用宿主机/目标机模式开发嵌入式应用软件时,首先利用宿主机上丰富的软硬件资源及良好的开发环境和调试工具来开发并仿真调试目标机上的软件,然后通过串口、USB接口或者以太网接口将交叉编译生成的目标代码和可执行文件传输并下载到目标机上,并在监控程序或者操作系统的支持下利用交叉调试器进行实时分析和调试,最后将程序下载固化到目标机上。在特定环境下目标机脱离宿主机单独运行,该开发过程如下图所示。6采用宿主机/目标机模式开发嵌入式应用软件过程示意图7在运行Linux的上位机上完成嵌入式软件源代码的编写之后,需要进行编译和链接以生成可执行代码。由于宿主机开发过程大多是在使用Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC等系列的微处理器,这就要求在建立好的交叉开发环境中使用宿主机上的交叉编译、汇编及连接工具进行交叉编译和链接,形成可执行的二进制代码(这种可执行代码并不能在宿主机上执行,而只能在目标板上执行),然后把可执行文件下载到目标机上运行。整个开发流程如下图所示。895.1.2嵌入式系统的设计流程嵌入式系统的开发设计流程类似于大多数其他计算机系统的设计流程。在遵循一般工程开发流程的基础上,嵌入式系统的开发设计流程有其自身的特点,且已经逐步规范化,其简化的设计流程图如下图所示。该设计过程一般可以分为五个阶段:需求分析、体系结构设计、硬件/软件设计、系统集成以及系统测试。以上各个阶段之间往往需要不断地反复和修改,直至完成最初的设计目标,到得符合要求的最终产品。10115.2嵌入式Linux开发流程如果在一个嵌入式系统开发过程中使用Linux操作系统和相关技术,一般需要经过如下的流程:1.建立开发环境。2.配置开发主机,包括Minicom、IP地址、NFS网络文件系统等的配置3.建立引导装载程序bootloader。4.下载别人已经移植好的Linux操作系统。5.建立根文件系统。6.建立应用程序的Flash分区。7.开发应用程序。8.烧写内核、根文件系统、应用程序。9.发布产品。125.3嵌入式系统开发环境的建立建立嵌入式Linux开发环境一般有如下三种方案:1.基于PC机Windows操作系统下的Cygwin2.在PC机上直接安装Linux操作系统3.先在Windows操作系统下安装虚拟机,然后在虚拟机中安装Linux操作系统135.3.1建立开发环境5.3.2开发环境的配置嵌入式应用程序的开发一般先在宿主机上调试完成,然后下载到目标机。为保证正常下载,必须建立宿主机与目标机之间的可靠连接。宿主机上的VMware软件及Linux系统安装好之后,需要配置好宿主机的开发环境才能与开发机正常进行通信。在5.1.1小节嵌入式系统的开发模式中已经提到,宿主机与目标机之间的一般通过串口、以太网口、USB或者JTAG接口进行通信,如下图所示。14155.4BootLoader一个嵌入式Linux系统从软件角度通常可以分为引导加载程序、Linux操作系统内核、文件系统和用户应用程序四个层次。其中的引导加载程序是计算机系统加电后运行的第一段软件代码。引导加载程序包括固化在固件(firmware)中的Boot代码(可选)和BootLoader两大部分。引导程序BootLoader的总目标就是在嵌入式系统上电后正确地调用内核并执行。对于某些不使用操作系统的嵌入式系统而言,应用程序的运行同样也需要依赖于引导程序,因此BootLoader对于嵌入式系统来说是非常必要的。165.4.1BootLoader详解BootLoader的主要功能包括:(1)硬件设备初始化(CPU的主频、SDRAM、中断、串口等);(2)内核启动参数;(3)启动内核;(4)与主机进行交互,从串口、USB口或者网络口下载映像文件,并可以对Flash等存储设备进行管理。17BootLoader的工作原理:首先完成系统硬件的初始化,包括时钟的设置、存储器的映射等,设置堆栈指针;然后跳转到操作系统内核入口,如系统在加电或复位时,通常从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。这样,将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。至此之后,系统的运行就在操作系统的控制下了。18BootLoader的实现依赖于处理器的体系结构,因此大多数BootLoader的结构分为阶段1(stage1)和阶段2(stage2)两部分。依赖于处理器体系结构如设备初始化等的代码,通常都放在阶段1中,而且通常用汇编语言编码实现,以达到短小精悍的目的。而阶段2通常用C语言来实现,这样可以实现一些复杂的功能,而且代码会具有更好的可读性和可移植性。19BootLoader阶段1的启动步骤如图5.23所示,具体任务包括:(1)基本的硬件初始化,包括屏蔽所有的中断、设置CPU的速度和时钟频率、RAM初始化、关闭CPU内部指令/数据Cache;(2)为加载BootLoader的stage2准备RAM空间;(3)拷贝BootLoader的stage2到RAM中;(4)设置堆栈指针;(5)跳转到stage2的C入口点。20BootLoader阶段2的启动步骤如图5.24所示,具体任务包括:(1)初始化本阶段要使用到的硬件设备;(2)检测系统内存映射;(3)加载kernel内核映像和根文件系统映像。将kernel映像和根文件系统映像从Flash上读到RAM空间中;(4)设置内核的启动参数;(5)跳转到内核映像入口并调用内核程序;(6)系统的软件设置,更新系统(system.bin)。215.4.2vivivivi是韩国Mizi公司开发的一种BootLoader,可用于ARM9处理器的引导。目前vivi只能利用串行通信为用户提供接口。为连接vivi,首先利用串口电缆连接宿主机和目标机,然后在主机上运行串口通信程序(超级终端),并在目标机上正确设置vivi以支持串口。正确连接后,就可以由串口通信程序显示提示信息。vivi支持基于S3C2410芯片UP-NETARM2410平台上Linux内核的引导,结构简单,可以传递内核参数。22vivi的源代码可从网站下载,源代码的目录树结构如图5.28所示,代码包括arch,CVS,Documentation,drivers,include,init,lib,scripts,test和util等几个目录,共200多条文件。vivi的操作模式:作为典型BootLoader之一的vivi的运行也可以分为两个阶段。23(1)vivi的第一阶段1)关WATCHDOG(上电后,WATCHDOG默认是开着的);2)禁止所有中断;3)初始化系统时钟;4)初始化内存控制寄存器(一共13个);5)检查是否从掉电模式唤醒,若是,则调用WakeupStart函数进行处理;6)点亮所有LED;7)初始化UART0;8)将vivi所有代码(包括stage1、stage2)从NANDFlash复制到SDRAM;9)跳到bootloader的stage2运行。24(2)vivi的第二阶段1)打印vivi的信息,包括版本号等;2)调用若干个初始化函数;3)boot_or_vivi():判断是否有“r”,回车或空格键按下,若有,则进入vivishell;若没有,则执行boot命令,启动内核;4)boot命令执行后,找到kernel分区,找它的偏移量和大小,执行boot_kernel()函数,拷贝内核映象;5)设置linux启动参数,打印“NowBootingLinux…”6)调用call_linux()函数,启动内核。255.4.3U-BootU-Boot,全称UniversalBootLoader,是遵循GPL协议的一个开放源码项目。最初由DENX软件工程中心的WolfgangDenk基于8xxROM的源码创建PPCBoot工程,SysgoGmbh将PPCBoot移植到ARM平台,创建ARMBoot工程,之后以PPCBoot和ARMBoot为基础,创建了U-Boot工程。U-Boot目前可支持PowerPC、ARM、X86、MIPS等体系结构的上百种开发板,已经成为功能最多、灵活性最强并且开发最积极的开放源码BootLoader。U-Boot提供两种操作模式:启动加载模式和下载模式,并具有大型BootLoader的全部功能。265.5Linux的根文件系统文件系统是用于组织在一个磁盘(包括光盘、软盘、Flash闪存及其它存储设备)或分区上的文件的目录结构。在Linux系统中,硬件设备是以文件的形式存在。如何将这些文件进行分类管理且提供与内核交互的接口,就形成了一定的逻辑目录结构,也就是文件系统。Linux内核在启动过程中会安装文件系统,文件系统是Linux操作系统不可缺少的重要组成部分。用户通常就是通过文件系统同操作系统与硬件设备进行交互的。275.5.1文件系统概述Linux可支持多种不同的文件系统,可用于不同存储介质的文件类型包括ext2、ext3、vfat、ntfs、iso9660、Romfs、JFFS、JFFS2和NFS等。Linux是通过把系统支持的各种文件系统链接到一个单独的树形层次结构中,来实现对多文件系统的支持的。为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(VirtualFileSystem)。285.5.2Linux根文件系统一个嵌入式Linux操作系统要能正常运行,除了需要移植BootLoader和Linux系统内核以外,还需要构建根文件系统。根文件系统是一种特殊的文件系统。Linux根文件系统一般包括的子目录有/bin、/dev、/etc、/usr、/var、/usr/bin等等,如下图所示:对其中的主要目录进行介绍。29305.5.3网络文件系统NFS(NetworkFileSystem)网络文件系统NFS(NetworkFileSystem)是由Sun公司于1984年推出并逐渐发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。利用NFS可以将远程文件系统载入在本地文件系统下。远程的硬盘、目录和光驱都可以变成本地主机目录树中的一个子目录。将远程文件系统载入后,在本地与处理自己的文件系统一样使用即可。不只方便,也节省了重复保存文件的空间、传输文件的时间及网络带宽。31NFS网络文件系统使用C/S(Client/Server)客户机和服务器体系结构。使用NFS,需要在服务器端设置输出,在客户端设置载入。服务器端提
本文标题:嵌入式系统设计-李秀娟-课件-第5章
链接地址:https://www.777doc.com/doc-2440485 .html