




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
FreshAir团队成果文档(版权所有)一 BootLoader简介 在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行。一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: 1、 引导加载程序。包括固化在固件(firmware)中的boot代码(可选),和BootLoader两大部分。 2、 Linux内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3、 文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。 4、 用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还会包括一个嵌入式图形用户界面。常用的嵌入式GUI有:MicroWindows和MiniGUI懂。 引导加载程序是系统加电后运行的第一段软件代码。PC机中的引导加载程序由BIOS(其本质就是一段固件程序)和位于硬盘MBR中的OS BootLoader(比如,LILO和GRUB等)一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后将控制权交给OS BootLoader。BootLoader的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。比如在一个基于ARM7TDMI core的嵌入式系统中,系统在上电或复位时通常都从地址0x00000000处开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。 简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。 通常,BootLoader是严重地依赖于硬件而实现的,特别是在嵌入式世界。因此,在嵌入式世界里建立一个通用的BootLoader几乎是不可能的。尽管如此,我们仍然可以对BootLoader归纳出一些通用的概念来,以指导用户特定的BootLoader设计与实现。 二、常见bootloader介绍1U-BOOT介绍 :uboot是一个庞大的公开源码的软件。他支持一些系列的arm体系,包含常见的外设的驱动,是一个功能强大的板极支持包。U-Boot是由开源项目PPCBoot发展起来的,ARMboot并入了PPCBoot,和其他一些arch的Loader合称U-Boot。2002年12月17日第一个版本U-Boot-0.2.0发布,同时PPCBoot和ARMboot停止维护。U-Boot自发布以后已更新6次,最新版本为U-Boot-1.1.1,U-Boot的支持是持续性的。其发布网址为:/projects/u-boot/U-Boot支持的处理器构架包括PowerPC (MPC5xx,MPC8xx,MPC82xx,MPC7xx,MPC74xx,4xx), ARM (ARM7,ARM9,StrongARM,Xscale),MIPS (4Kc,5Kc),x86等等, U-Boot(Universal Bootloader)从名字就可以看出,它是在GPL下资源代码最完整的一个通用Boot Loader。U-Boot提供两种操作模式:启动加载(Boot loading)模式和下载(Downloading)模式,并具有大型Boot Loader的全部功能。主要特性为:- SCC/FEC以太网支持 - BOOTP/TFTP引导 - IP,MAC预置功能 - 在线读写FLASH,DOC, IDE,IIC,EEROM,RTC- 支持串行口kermit,S-record下载代码 - 识别二进制、ELF32、pImage格式的Image,对Linux引导有特别的支持 - 监控(minitor)命令集:读写I/O,内存,寄存器、内存、外设测试功能等- 脚本语言支持(类似BASH脚本)- 支持WatchDog,LCD logo,状态指示功能等 U-Boot的功能是如此之强大,涵盖了绝大部分处理器构架,提供大量外设驱动,支持多个文件系统,附带调试、脚本、引导等工具,特别支持Linux,为板级移植做了大量的工作。U-Boot1.1.1版本特别包含了对SA1100和44B0芯片的移植,所以44B0移植主要是针对Board 的移植,包括FLASH、内存配置以及串口波特率等等。U-Boot的完整功能性和后续不断的支持,使系统的升级维护变得十分方便。 同时,u-boot移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。 2。vivi介绍(下载地址/developer):vivi是韩国mizi 公司开发的bootloader, 适用于ARM9处理器。 Vivi有两种工作模式:启动加载模式和下载模式。启动加载模式可以在一段时间后(这个时间可更改)自行启动linux内核,这时vivi的默认模式。在下载模式下,vivi为用户提供一个命令行接口,通过接口可以使用vivi提供的一些命令,如下:命令: Load 功能: 把二进制文件载入Flash或RAM Part 操作MTD分区信息。显示、增加、删除、复位、保存MTD分区 Param 设置参数Boot 启动系统Flash 管理Flash,如删除Flash的数据 vivi代码分析vivi的代码包括arch,init,lib,drivers和include等几个目录,共200多条文件。Vivi主要包括下面几个目录:arch:此目录包括了所有vivi支持的目标板的子目录,例如s3c2410目录。drivers:其中包括了引导内核需要的设备的驱动程序(MTD和串口)。MTD目录下分map、nand和nor三个目录。init:这个目录只有main.c和version.c两个文件。和普通的C程序一样,vivi将从main函数开始执行。lib:一些平台公共的接口代码,比如time.c里的udelay()和mdelay()。include:头文件的公共目录,其中的s3c2410.h定义了这块处理器的一些寄存器。Platform/smdk2410.h定义了与开发板相关的资源配置参数,我们往往只需要修改这个文件就可以配置目标板的参数,如波特率、引导参数、物理内存映射等。3.Redboot介绍:Redboot是Redhat公司随eCos发布的一个BOOT方案,是一个开源项目。当前Redboot的最新版本是Redboot-2.0.1,Redhat公司将会继续支持该项目,其官方发布网址为:/redboot/Redboot支持的处理器构架有ARM,MIPS,MN10300,PowerPC, Renesas SHx,v850,x86等,是一个完善的嵌入式系统Boot Loader。Redboot是在ECOS的基础上剥离出来的,继承了ECOS的简洁、轻巧、可灵活配置、稳定可靠等品质优点。它可以使用X-modem或Y-modem协议经由串口下载,也可以经由以太网口通过BOOTP/DHCP服务获得IP参数,使用TFTP方式下载程序映像文件,常用于调试支持和系统初始化(Flash下载更新和网络启动)。Redboot可以通过串口和以太网口与GDB进行通信,调试应用程序,甚至能中断被GDB运行的应用程序。Redboot为管理FLASH映像,映像下载,Redboot配置以及其他如串口、以太网口提供了一个交互式命令行接口,自动启动后,REDBOOT用来从TFTP服务器或者从Flash下载映像文件加载系统的引导脚本文件保存在Flash上。当前支持单板机的移植版特性有:- 支持ECOS,Linux操作系统引导- 在线读写Flash- 支持串行口kermit,S-record下载代码- 监控(minitor)命令集:读写I/O,内存,寄存器、 内存、外设测试功能等Redboot是标准的嵌入式调试和引导解决方案,支持几乎所有的处理器构架以及大量的外围硬件接口,并且还在不断地完善过程中。4.ARMboot:ARMboot是一个ARM平台的开源固件项目,它特别基于PPCBoot,一个为PowerPC平台上的系统提供类似功能的姊妹项目。鉴于对PPCBoot的严重依赖性,已经与PPCBoot项目合并,新的项目为U-Boot。ARMboot发布的最后版本为ARMboot-1.1.0,2002年ARMboot终止了维护,其发布网址为:/projects/armbootARMboot支持的处理器构架有StrongARM ,ARM720T ,PXA250 等,是为基于ARM或者StrongARM CPU的嵌入式系统所设计的。ARMboot的目标是成为通用的、容易使用和移植的引导程序,非常轻便地运用于新的平台上。ARMboot是GPL下的ARM固件项目中唯一支持Flash闪存,BOOTP、DHCP、TFTP网络下载,PCMCLA寻线机等多种类型来引导系统的。特性为:- 支持多种类型的FLASH- 允许映像文件经由BOOTP、DHCP、TFTP从网络传输;- 支持串行口下载S-record或者binary文件- 允许内存的显示及修改- 支持jffs2文件系统等Armboot对S3C44B0板的移植相对简单,在经过删减完整代码中的一部分后,仅仅需要完成初始化、串口收发数据、启动计数器和FLASH操作等步骤,就可以下载引导uClinux内核完成板上系统的加载。总得来说,ARMboot介于大、小型Boot Loader之间,相对轻便,基本功能完备,缺点是缺乏后续支持。4.Blob:Blob(Boot Loader Object)是由Jan-Derk Bakker and Erik Mouw发布的,是专门为StrongARM 构架下的LART设计的Boot Loader。Blob的最后版本是blob-2.0.5,其发布网址为:http:/www.lart.tudelft.nl/lartware/blob/Blob支持SA1100的LART主板,但用户也可以自行修改移植。Blob也提供两种工作模式,在启动时处于正常的启动加载模式,但是它会延时 10 秒等待终端用户按下任意键而将 Blob 切换到下载模式。如果在 10 秒内没有用户按键,则 Blob 继续启动 Linux 内核。其基本功能为:初始化硬件(CPU速度,存储器,中断,RS232串口)- 引导Linux内核并提供ramdisk- 给LART下载一个内核或者ramdisk- 给FLASH片更新内核或者ramdisk- 测定存储配置并通知内核- 给内核提供一个命令行Blob功能比较齐全,代码较少,比较适合做修改移植,用来引导Liunx,目前大部分S3C44B0板都用Blob修改移植后来加载uClinux。 5.Bios-lt:Bios-lt是专门支持三星(Samsung)公司ARM构架处理器S3C4510B的Loader,可以设置CPU/ROM/SDRAM/EXTIO,管理并烧写FLASH,装载引导uClinux内核。这是国内工程师申请GNU通用公共许可发布的。 Bios-lt的最新版本是Bios-lt-0.74,另外还提供了S3C4510B的一些外围驱动,其发布网址为:/projects/bios-lt6.Bootldr:Bootldr是康柏(Compaq)公司发布的,类似于compaq iPAQ Pocket PC,支持SA1100芯片。它被推荐用来引导Llinux,支持串口Y-modem协议以及jffs文件系统。 Bootldr的最后版本为Bootldr-2.19,其发布网址为: /software/bootldr/7. 基于wce的eboot:在WinCE中用的最多的就是EBOOT,是一个基于网络的Bootloader,而且可以根据需要带有命令行菜单功能,网络调试功能以及文件系统的相关功能。在这里只谈ARM平台的引导,因为ARM架构的CPU用的最普遍。一般基于不同的硬件设计,会有不同的引导方式:NORFlash Boot:一般ARM处理器的片选0都会接有NORFlash,这样在ARM上电以后,会从0地址开始执行程序,也就是从NORFlash的0地址开始执行。所以把EBOOT烧到NORFlash的0地址开始的地方,这样在上电以后,EBOOT开始执行,可以在NORFlash里面执行,也可以自拷贝到SDRAM中执行。最后加载WinCE image并运行。NANDFlash Boot with EBOOT:由于NORFlash容量小,价格贵,现在很多ARM处理器支持NandFlash引导。不同厂家的处理器对Nandflash的引导略有区别,具体要看datasheet。但是本质就是先从Nandflash中读出一个小的Loader来运行,这个Loader再从Nandflash中加载EBOOT到SDRAM中运行,最后EBOOT加载WinCE image,就是NK.bin。NANDFlash Boot without EBOOT:如果在NandFlash引导的时候不需要EBOOT,也可以不用EBOOT。这样就是系统启动后从Nandflash中加载一个小的Loader,小的Loader对硬件系统作基本的初始化,然后直接加载WinCE image,一般应该是NK.nb0,然后运行。这里来说一下NK.bin与NK.nb0,两个不同的WinCE image。NK.nb0:就是一个可以直接运行的WinCE映像文件,直接拷贝到SDRAM中就可以运行。NK.bin:被称为Windows CE binary image data format文件格式,是一种包含了多个独立纪录(Section)的二进制文件。在加载的时候,需要分别加载,不同的Section加载到不同的地方。所以NK.bin需要Bootloader进行解释性加载。但是他的Size会比NK.nb0小。可以使用viewbin命令查询NK.bin中的纪录信息。viewbin rec nk.bin前面已经讲过了一般系统会使用到的引导方式,下面介绍一下EBOOT。在WinCE中EBOOT一个作用可以加载WinCE image,还可以通过网络配合Platform Builder下载WinCE image进行调试。在开发一个新的BSP的时候,首先会基于一个相似的平台的BSP进行克隆,然后要做的就是要开发和调试EBOOT了,EBOOT的架构如图:BLCOMMON:相当于EBOOT的一个基本框架,主要完成bootloader相关内存的分配,解析NK.bin文件并进行效验,初始化平台,通过网络下载image等功能。OEM Code:主要是基于硬件平台,为BLCOMMON提供相应的接口函数,帮助完成相应的功能。Eboot:一个小的网络协议栈,为网络下载image提供DHCP,TFTP,UDP等网络服务功能。Network Driver:硬件平台的网络驱动部分,支持上层的网络功能。Bootpart:为Flash设备提供分区功能,bootloader可以创建一个BinFS分区和一个文件系统分区。还可以用它来创建一个引导分区用来存放引导参数。Flash Memory:硬件平台的Flash驱动。三、自己编写bootloader的方法和步骤1. WinCE系统下BootLoader的开发BootLoader是一段单独的程序代码,它存放于目标平台的非易失存储介质中,如ROM或Flash。在开发CE的过程中,它主要用于启动硬件和下载nk.bin到目标板上,并有一定的监控作用。图1描述了WinCE的BSP基本结构以及BootLoader所处的位置。一般来说,对于BootLoader的功能要求并不是严格定义的,不同的场合区别很大。比如,在PC的硬件平台上,由于硬件启动根本就不是通过BootLoader(而是通过BIOS),所以BootLoader就不需要对CPU加电后的初始化做任何工作;而在笔者的开发平台(MIPS32)上,BootLoader是最先被执行的程序,所以就必须包括加电初始化程序。通常,BootLoader必须包含下载CE映像文件的功能。另外,管理监控硬件设备通常也是必须的,因为这可以极大地方便工程开发。由于BootLoader涉及到基本的硬件操作,如CPU的结构、指令等,同时又涉及到以太网下载协议(TFTP,当然也可能通过串口)和策软设定的映像文件格式。因此从零实现的话,会需要相当长的过程。好在微软为每种类型的CPU都提供了某种标准开发板的BootLoader例程,因此通常的做法是:从这些例程中寻找与硬件平台最接近的作为标本程序,然后再从自己的硬件平台上入手做相应的改动。一些新的评估板可能会由第三方的厂商来提供Bootloader。如果硬件平台是从这样的基板设计而来的话,那么最好去寻求这些厂商获取Bootloader来移植,以减少工作量。笔者使用的硬件平台基于MIPS32架构,下载端口采用的是以太网口,同时还具备一个串口,主机相连,通过超级终端对该平台加以控制。该平台是参考AMD的一款标准估计板设计的,BootLoader以该板的BootLoader为参考进行了移植。前面已经提到,由于硬件的不同,BootLoader的功能可能有多有少,下面对开发BootLoader的过程进行叙述。图2是BootLoader的工程流程。1 启动部分首先要实现初台化硬件的功能。在参考板的BootLoader目录下,会发现一些.s文件,可能会是init.s或者是reset.s等,这样的文件是CPU加电后最先执行的代码。由于此处是用汇编语言编写的,所以与CPU关系紧密。一般参考板的CPU与开发平台的CPU会是相同或者是同一个架构的。笔者使用的是属于同一种CPU的情况,所以对寄存器的定义和初始化流程都可以不加改动。接着就是对于平台配置的分析,包括平台存储空间的分配、外围设备的工作设定等。一般这里的区别是非常大的。所以必须要对CPU寄存器的值作相应设定。这部分工作可能需要CPU提供商方面的帮助。应该说,这部分工作是BootLoader的一大重点,但由于和实际的硬件非常大,所以不可能做进一步的详细叙述。2 主控部分从这一部分开始,均用C语言编写。为了增加BootLoader对平台的控制,一般BootLoader都会设计成支持命令输入的方式,通过串口来接收用户的命令。这种机制中,如果参考板有Loader支持的话,那么可以自己添加有实用价值的命令,完成一些需要的功能。从图2中可以看出,一般在平台调试完毕后,可以在不用人工干预的情况下自动加载CE(这也是BootLoader必需的功能之一);而在调试阶段,基本上是通过Loader所支持的命令来进行操作的。提供足够丰富的命令,能极大简化和全面测试开发平台。如下所列,是Loader所提供的一些常用命令。命令 说明Help_列出所有支持的命令并加以说明Eboot _从开发台下载CE映像并加载Write_向某一内存地址写入数据Read_显示某一内存地址的数据Jump_跳转到某一地址执行程序Xmodem_从计算机的超级终端接收以Xmodem协议传送的文件Toy_测试平台CPU的计数器是否运转Flash_擦除或者更新Flash中的数据Tlbread_显示CPU的所有TLB表Tlbwrit_设置CPU的TLBMacaddr_设置CPU的MAC地址Seti_设置平台的IP地址这些命令涉及到平台调试的各个方面,像内存检测、Flash操作、文件下载等。借助于这些命令,不仅可以完成硬件平台的部分测试,还完成了作为CE的BootLoader程序最为重要的一个功能下载CE映像。3.下载部分在用Platform Builder编译生成CE的映像文件后,接下来就需要将该文件下载到目标板上。如果说硬件调试功能可以由其它的程序代替而不放入BootLoader中,但是下载映像文件却是BootLoader必需的功能。CE映像文件通常叫做nk.bin,它是Windows CE二进制数据格式文件,不仅包含了有效的程序代码,还有按照一定规则加入的控制信息。当然,也可以选择生成.sre格式的代码文件,但是相于对前一种格式,它的代码要长很多,所需要的下载时间也更长。在这里,我们以下载.bin格式的文件来说明下载的实现。首先看一下图3所示的BootLoader下载部分的流程图。通常,在Platform Builder自带的代码中,会包含完成TFTP连接的了基本的函数。*初始化TFTP连接:用函数EbootInitTFtp()和EbootInitTFtpd()完成。*登记解析.bin格式数据的回调函数:用EbootTFtpdServerRegister()完成。*发出连接请求:用EbootSendBootme()完成。*接收主机端发出的数据包:用EbootTFtpReceiver()完成。在这里,需要重点说明的有两点。对于接收数据包的函数EbootTFtpReceiver(),它只能处理已经存入内存的以太网包,也就是说,从以太网控制器接收数据的功能必须要用户去完成。由于这一功能与硬件密切相关,所以不能使用PB自带的函数来完成。函数EbootTFtpdServerRegister()会登记一个回调函数,一般用户可以自己定义这个函数,该函数用于完成,bin格式数据的解析和保存,有效数据至目的地RAM。PB有自带的例程函数可作参考。一般来说,如果目的地就是RAM的话,直接参考例程函数即可。但是如果目的地就是Flash,不要直接存入Flash(字为单位),应先存入内存中待下载完毕以后再导入Flash。当然,这种方法必须要有足够的内存。如果没有足够的内存,也可以缓存部分数据后,分段写入Flash。4 支持DOC对于WinCE操作系统而言,丰富的多媒体功能是其一大特点,使其成为当前消费类电子产品操作系统中的一个不错选择。但是随之而来的问题是,系统的容易已经大大超过出了传统嵌入式系统上百KB的数量级。一般来说,如果选择了图形界面和汉语支持,容量一般会超过16MB。DOC(Disk On Chip)则提供了一种相对廉价的大存储容量的解决方案。DOC本质上是一种加以软件控制的NAND格式的Flash,通过TFFS这一软件层提供对WinCE的支持。由于DOC不能像内存一样被直接访问,所以其加载WinCE的过程有些特殊,必须要在BootLoader中加入专门的代码,才能使用DOC来存放WinCE映像文件。为了说明怎样在Loader文件中提供DOC的支持,先看一如何采用DOC系统启动CE,如图4所示。从图4可以看出,当采用DOC作为存储体的时候,实际上是在启动的时候把映像文件拷贝到内存中执行。为了实现这一启动过程,就必须涉及到DOC的读写操作。首先要从M-SYSTEM的网站上获取DOC的BOOT软件开发包。在这个开发包里,提供了一系列DOC的操作函数。将此开发包嵌入到CE的BootLoader中去,然后按照图4的步骤,调用相应的读写函数完成这一过程。对于开发包中相关函数的说明,笔者就不具体介绍了,可以参考开发包的说明文档。5 .BootLoader的编译、链接和下载BootLoader程序可以通过PB的集成编译环境编译链接,控制文件为.bib文件,下面是一个简单的BootLoader的.bib文件。MEMORYCLI 9fc00000 00050000 RAMIMAGERAM 80080000 00070000 RAMCONFIGCOMPRESSION=ONSRE=ONROMSTART=9fc00000ROMSIZE=00020000ROMWIDTH=32ROMOFFET=000000MODULESNk.exe $(_FLATRELEASEDIR).exe CLIMEMORY部分 定义了生成的映像文件的目标地址,以及程序运行可以使用的内存空间。CONFIG部分 COMPRESSION是否对目标代码进行压缩;SRE是否生成格式为sre的目标代码;ROMSTART与ROMSIZE、ROMWIDTH、ROMOFFSET共同定义了开发平台上存放BootLoader物理介质的起始地址、大小、宽度和偏移量。MODULES部分 定义了BootLoader所包含的文件,一般就只有一个文件:cli.exe。编译过程中,首先用命令build-c编译生成文件cli.exe,然后用romimage cli.bib命令产生最后的映像文件cli.sre。对于BootLoader文件的下载;有很多种方法:可以通过仿真器下载;也可以通过其它调试程序下载;还可以直接烧写到Flash中。需要说明的一点是,这些方法可能会要求不同的映像格式。在PB环境下,可以生成的有.sre格式、纯二进制格式(用于直接烧写Flash)以及和CE映像一样的.bin格式。从CE的BootLoader开发流程可以看出,BootLoader在完成下载CE映像和加载映像的主要功能外,还具有一些调试硬件的功能。当然,这些功能不是必需的,随不同的用户可能有自己的定义。但是不管Loader的功能设计得多么简单或者是多么复杂,都是在开发CE系统中不可跳过的一环。实际上,由于Loader有和CE系统交互数据的区域,所以还有对CE启动过程的控制作用,也是PB控制目标板CE启动的一个窗口。可以说,一个功能齐全的Loader,不论是对调试硬件,还是控制和检测CE系统,甚至是成为产品之后的维护工作,都是大有帮助的。编写BootLoader是开发WinCE系统第一步,也是关键的一步。只有得到一个稳定工作的Loader程序,才能够更进一步开发WinCE的BSP,直至最后整个系统的成功。2. Linux系统下BootLoader的开发:Linux系统下的BootLoader 的实现依赖于CPU的体系结构,因此大多数 BootLoader 都分为stage1 和stage2 两大部分。依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在 stage1中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而stage2 则通常用C 语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。BootLoader 的 stage1 通常包括以下步骤:硬件设备初始化;为加载Boot Loader的stage2准备 RAM 空间;拷贝Boot Loader的stage2 到RAM空间中;设置好堆栈;跳转到 stage2 的 C 入口点。Boot Loader的stage2通常包括以下步骤:初始化本阶段要使用到的硬件设备;检测系统内存映射(memory map);将kernel 映像和根文件系统映像从flash上读到 RAM 空间中;为内核设置启动参数;调用内核。本系统中的BootLoader参照韩国mizi公司的vivi进行修改。1.开发环境ADT嵌入式开发环境由ADT Emulator for ARM 和ADT IDE for ARM组成。ADT Emulator for ARM 通过JTAG 实现主机和目标机之间的调试支持功能。它无需目标存储器,不占用目标系统的任何端口资源。目标程序直接在目标板上运行,通过ARM 芯片的JTAG 边界扫描口进行调试,属于完全非插入式调试,其仿真效果接近真实系统。ADT IDE for ARM 为用户提供高效明晰的图形化嵌入式应用软件开发环境,包括一整套完备的面向嵌入式系统的开发和调试工具:源码编辑器、工程管理器、工程编译器(编译器、汇编器和连接器)、集成调试环境、ADT Emulator for ARM 调试接口等。其界面同Microsoft Visual Studio 环境相似,用户可以在ADT IDE for ARM 集成开发环境中创建工程、打开工程,建立、打开和编辑文件,编译、连接、设置、运行、调试嵌入式应用程序。ADT嵌入式软件开发环境采用主机目标机交叉开发模型。ADT IDE for ARM 运行于主机端,而ADT Emulator for ARM 实现ADT IDE for ARM 与目标机之间的连接。开发时,首先由ADT IDE for ARM 编译连接生成目标代码,然后建立与ADT Emulator for ARM 之间的调试通道,调试通道建立成功后,就可以在ADT IDE for ARM 中通过ADT Emulator for ARM 控制目标板实现目标程序的调试,包括将目标代码下载到目标机中,控制程序运行,调试信息观察等等。ADT是收费的软件开发平台。ADS(ARM Development System)用的比较多的开发平台,是ARM公司自己推出的一块IDE开发环境,支持ARM汇编,包括ARM指令集和16位Thumb指令集,c语言等。也有语法高亮显示,编译工程后可以实现函数间的跳转。难的就是配置一些开发环境的选项,初学者一般按照具体开发板手册配置或是利用已经提供好的工程模板。 2.ARM汇编ARM本身属于RISC指令系统,指令条数就很少,而其编程又以C等高级语言为主,我们仅需要在Bootloader的第一阶段用到少量汇编指令:(1)+-运算ADD r0, r1, r2 r0 := r1 + r2SUB r0, r1, r2 r0 := r1 - r2其中的第二个操作数可以是一个立即数:ADD r3, r3, #1 r3 := r3 + 1第二个操作数还可以是位移操作后的结果:ADD r3, r2, r1, LSL #3 r3 := r2 + 8.r1(2)位运算AND r0, r1, r2 r0 := r1 and r2ORR r0, r1, r2 r0 := r1 or r2EOR r0, r1, r2 r0 := r1 xor r2BIC r0, r1, r2 r0 := r1 and not r2(3)寄存器搬移MOV r0, r2 r0 := r2MVN r0, r2 r0 := not r2(4)比较CMP r1, r2 set cc on r1 - r2CMN r1, r2 set cc on r1 + r2TST r1, r2 set cc on r1 and r2TEQ r1, r2 set cc on r1 or r2 这些指令影响CPSR寄存器中的 (N, Z, C, V) 位(5)内存操作LDR r0, r1 r0 := mem r1STR r0, r1 mem r1 := r0LDR r0, r1, #4 r0 := mem r1+4LDR r0, r1, #4 ! r0 := mem r1+4 r1 := r1 + 4LDR r0, r1, #4 r0 := mem r1 r1 := r1 +4LDRB r0 , r1 r0 := mem8 r1LDMIA r1, r0, r2, r5 r0 := mem r1 r2 := mem r1+4 r5 := mem r1+8. 可以包括r0r15中的所有寄存器,若包括r15 (PC)将导致程序的跳转。(6)控制流例1:MOV r0, #0 ; initialize counterLOOP:ADD r0, r0, #1 ; increment counterCMP r0, #10 ; compare with limitBNE LOOP ; repeat if not equal例2:CMP r0, #5ADDNE r1, r1, r0SUBNE r1, r1, r2if (r0 != 5) r1 := r1 + r0 - r23.BootLoader第一阶段3.1硬件设备初始化基本的硬件初始化工作包括:屏蔽所有的中断;设置CPU的速度和时钟频率;RAM初始化;初始化LEDARM的中断向量表设置在0地址开始的8个字空间中,如下表:每当其中的某个异常发生后即将PC值置到相应的中断向量处,每个中断向量处放置一个跳转指令到相应的中断服务程序去进行处理,中断向量表的程序如下: 0x00: Resetb Reset 0x04: Undefined instruction exceptionUndefEntryPoint:b HandleUndef 0x08: Software interrupt exceptionSWIEntryPoint:b HandleSWI 0x0c: Prefetch Abort (Instruction Fetch Memory Abort)PrefetchAbortEnteryPoint:b HandlePrefetchAbort 0x10: Data Access Memory AbortDataAbortEntryPoint:b HandleDataAbort 0x14: Not usedNotUsedEntryPoint:b HandleNotUsed 0x18: IRQ(Interrupt Request) exceptionIRQEntryPoint:b HandleIRQ 0x1c: FIQ(Fast Interrupt Request) exceptionFIQEntryPoint:b HandleFIQ复位时关闭看门狗定时器、屏蔽所有中断:Reset: disable watch dog timermov r1, #0x53000000mov r2, #0x0str r2, r1 disable all interruptsmov r1, #INT_CTL_BASEmov r2, #0xffffffffstr r2, r1, #oINTMSKldr r2, =0x7ffstr r2, r1, #oINTSUBMSK设置系统时钟:init clk 1:2:4mov r1, #CLK_CTL_BASEmov r2, #0x3str r2, r1, #oCLKDIVNmrc p15, 0, r1, c1, c0, 0 read ctrl registerorr r1, r1, #0xc0000000 Asynchronousmcr p15, 0, r1, c1, c0, 0 write ctrl register now, CPU clock is 200 Mhzmov r1, #CLK_CTL_BASEldr r2, mpll_200mhzstr r2, r1, #oMPLLCON点亮所有的用户LED: All LED onmov r1, #GPIO_CTL_BASEadd r1, r1, #oGPIO_Fldr r2,=0x55aastr r2, r1, #oGPIO_CONmov r2, #0xffstr r2, r1, #oGPIO_UPmov r2, #0x00str r2, r1, #oGPIO_DAT设置(初始化)内存映射:ENTRY(memsetup) initialise the static memory set memory control registersmov r1, #MEM_CTL_BASEadrl r2, mem_cfg_valadd r3, r1, #521: ldr r4, r2, #4str r4, r1, #4cmp r1, r3bne 1bmov pc, lr设置(初始化)UART: set GPIO for UARTmov r1, #GPIO_CTL_BASEadd r1, r1, #oGPIO_Hldr r2, gpio_con_uartstr r2, r1, #oGPIO_CONldr r2, gpio_up_uartstr r2, r1, #oGPIO_UPbl InitUART Initialize UART r0 = number of UART portInitUART:ldr r1, SerBasemov r2, #0x0str r2, r1, #oUFCONstr r2, r1, #oUMCONmov r2, #0x3str r2, r1, #oULCONldr r2, =0x245str r2, r1, #oUCON#define UART_BRD (50000000 / (UART_BAUD_RATE * 16) - 1)mov r2, #UART_BRDstr r2, r1, #oUBRDIVmov r3, #100mov r2, #0x01: sub r3, r3, #0x1tst r2, r3bne 1b#if 0mov r2, #Ustr r2, r1, #oUTXHL1: ldr r3, r1, #oUTRSTATand r3, r3, #UTRSTAT_TX_EMPTYtst r3, #UTRSTAT_TX_EMPTYbne 1bmov r2, #0str r2, r1, #oUTXHL1: ldr r3, r1, #oUTRSTATand r3, r3, #UTRSTAT_TX_EMPTYtst r3, #UTRSTAT_TX_EMPTYbne 1b#endifmov pc, lr此外,vivi还提供了几个汇编情况下通过串口打印字符的函数PrintChar、PrintWord和PrintHexWord: PrintChar : prints the character in R0 r0 contains the character r1 contains base of serial port writes ro with XXX, modifies r0,r1,r2 TODO : write ro with XXX reg to error handlingPrintChar:TXBusy:ldr r2, r1, #oUTRSTATand r2, r2, #UTRSTAT_TX_EMPTYtst r2, #UTRSTAT_TX_EMPTYbeq TXBusystr r0, r1, #oUTXHLmov pc, lr PrintWord : prints the 4 characters in R0 r0 contains the binary word r1 contains the base of the serial port writes ro with XXX, modifies r0,r1,r2 TODO : write ro with XXX reg to error handlingPrintWord:mov r3, r0mov r4, lrbl PrintCharmov r0, r3, LSR #8 /* shift word right 8 bits */bl PrintCharmov r0, r3, LSR #16 /* shift word right 16 bits */bl PrintCharmov r0, r3, LSR #24 /* shift word right 24 bits */bl PrintCharmov r0, #rbl PrintCharmov r0, #nbl PrintCharmov pc, r4 PrintHexWord : prints
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 精英人才甄选:潜质干部面试题库精 编版
- 企业运营战略下的奇葩面试题目解读
- 保研面试经验分享:专业领域的求职策略与题目
- 2026届黑龙江省大庆市化学高一上期末复习检测试题含解析
- 纳米技术教学讲解
- 配套制度案例讲解
- 新疆乌鲁木齐市2026届化学高二上期末教学质量检测试题含答案
- 详解纪念辛亥革命110周年全文解读
- 数学年龄倍数讲解
- 新医院发展规划
- 2025年造价工程师-水运工程造价工程师历年参考题库含答案解析(5套典型题)
- 2025年医学三基考试(医师)三基考试真题(含答案)
- 2025年继续教育公需课考试试题及答案
- 2025年卫生系统招聘考试-卫生系统招聘考试(预防医学专业知识)历年参考题库含答案解析(5卷套题【单项选择题100题】)
- 2025年全科医生考试试题及答案
- 2025年全国职业病防治知识竞赛试题含答案
- DB5308-T 74-2023 景迈山古茶林保护管理技术规范
- 公司科技研发管理办法
- 银行保安制度管理办法
- 中国阅兵仪式课件
- 浙江省2025年中考真题数学试卷及答案
评论
0/150
提交评论