资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,*,第4章 无操作系统的应用软件开发,第4章 无操作系统的应用软件开发,1,嵌入式软件系统分为无操作系统和有操作系统。,前者包括引导程序和应用程序,后者则在引导程序结束后运行操作系统,并将应用程序作为任务添加到操作系统中。,NOTE:,运行操作系统会占用大量宝贵的硬件资源,因此很多硬件资源有限、任务简单的嵌入式应用并不使用操作系统。,嵌入式软件系统分为无操作系统和有操作系统。,2,嵌入式系统不管是否使用操作系统,都需要一段引导程序BootLoader来初始化硬件,为操作系统或应用程序的运行做准备。,BootLoader是硬件与软件的桥梁,其作用就是初始化硬件设备、编址空间映射,建立系统软、硬件的正常工作状态。,BootLoader的开发已经成为嵌入式系统教学和工程中的技术瓶颈。,本章的内容:,*介绍BootLoader的功能,*分析s3c4510b的编址空间映射,*分析BootLoader的启动过程,*提出工程中BootLoader的解决方案。,*用实例介绍不使用嵌入式操作系统的软件开发流程和代码固化方法。,本章的目标:,让读者能使用ADS开发一个完整的不使用操作系统的嵌入式系统。,嵌入式系统不管是否使用操作系统,都需要一段引导程序BootL,3,4.1 软件开发数据流向图,在不使用嵌入式操作系统的情况下,在ADS上能完成从BootLoader到应用程序的整个开发流程,使用JTAG仿真器进行调试,RS-232串口作为标准输入/输出,数据流向如P120 图4.1所示。,在调试阶段:,使用ADS开发应用程序,编译生成带调试信息的.axf文件;,用JTAG仿真器连接实验板和PC,将实验板上电,打开调试代理软件检测到ARM核处理器,在AXD中使用setmem或obey命令设置CPU特殊功能寄存器配置存储空间;,加载.axf文件到SDRAM存储器就可以调试运行了;,利用AXD提供的单步、断点等调试手段,可以方便地查看CPU寄存器、存储器内容。,4.1 软件开发数据流向图在不使用嵌入式操作系统的情况下,在,4,NOTE:,*程序是在SDRAM里运行的,因此掉电后不能保存;,*应用程序调试完毕后,将其加入BootLoader,编译生成不带调试信息的.bin文件,bin格式的映象文件只能全速运行;,*烧写.bin文件需要一个专门的Flash烧写程序(扩展名为.axf)。,*先采用上述调试软件的方法将烧写程序.axf文件加载到SDRAM,然后选择AXD的File菜单里面的Load Image命令,将应用程序.bin文件加载到SDRAM的合适地址上,运行烧写程序,就能将.bin文件烧写到Flash存储器了。,*在调试或烧写过程中,可以将必要信息通过RS-232串口输出到PC超级终端进行显示。,NOTE:,5,4.2无操作系统的软件运行模式,不使用操作系统时,嵌入式软件系统包含引导程序和应用程序两个部分:,(1)引导程序是嵌入式软件系统中必不可少的部分,完成硬件初始化、存储器空间映射和设置系统工作状态等工作。,(2)应用程序则根据不同应用目的而编写。,无操作系统下的各种软件运行模式的主要区别在于:,引导程序和应用程序的各种组成方式。,NOTE:,下面介绍的四种模式中采用的编址空间是经过二次存储器映射后的空间,在没有了解存储器的二次映射之前,只需要了解此图中各个部分的逻辑关系即可,不用去考虑物理地址。,4.2无操作系统的软件运行模式不使用操作系统时,嵌入式软件系,6,无操作系统的嵌入式软件运行模式:,1、应用程序和引导程序在一个工程中一起编译为一个.bin文件,烧写到Flash存储器地址0 x0,引导程序运行结束后直接跳转到应用程序的入口处:,(1)BootLoader启动后,Flash中的所有程序被复制到SDRAM存储器中,如图4.2 P121,(2)引导程序结束后就进入应用程序,这种跳转方式通过在引导程序中导入应用程序主函数名称来实现。,(3)从汇编程序跳转到应用程序时,编译器会自动计算跳转的目的地址。,。,7,(4)跳转的代码如下:,IMPORT C_Entry ;导入应用程序的C_Entry函数,BL C_Entry ;跳转到该函数,跳转地址由编译器在编译时计算,NOTE:,应用程序存放到SDRAM的引导程序后,但其起始地址并不固定,在编译时,应用程序的起始地址随着引导程序的大小而变化。,(4)跳转的代码如下:,8,2、应用程序和引导程序分别编译为两个.bin文件,引导程序烧写到Flash存储器地址0 x0,应用程序则烧写到存储器中的某个地址,引导程序运行结束后跳转到该地址运行应用程序,(1)BootLoader启动后,Flash中的所有程序被复制到SDRAM存储器中,如图4.3 P121,(2)引导程序结束后就进入应用程序,即将PC指针跳转到应用程序的起始地址,跳转的代码如下:,LDR R1,=0X10000,MOV PC,R1,NOTE:,这种模式下,应用程序和引导程序被单独编译为两个.bin文件,因此应用程序可以灵活地烧写到任意地址处。,本例中应用程序被烧写到0 x10000为例。,2、应用程序和引导程序分别编译为两个.bin文件,引,9,3、扩展引导程序,使其初始化功能结束后即可跳转到一个函数入口,也可以跳转到指定地址,在此模式下,引导程序和其扩展的部分在一个工程中,编译为.bin文件,最后烧写到Flash存储器的地址0 x0处,应用程序既可以随引导程序一起编译,也可以单独编译并下载到指定地址。,如P122 图4.4所示,引导程序完成后跳转到扩展程序中,可以进行串口初始化、人-机交互、按键判断、硬件电路自检、操作系统升级等功能,也可以根据输入命令跳转到相应程序或引导操作系统运行。,这种模式集合了前两种模式的特点,启动过程较为灵活,并可以提供丰富的扩展功能,在实际工程中得到了广泛应用。,常用的通用引导程序,如U-Boot等都是采用这种模式。,3、扩展引导程序,使其初始化功能结束后即可跳转到一个,10,4、应用程序编译为.axf 文件,下载到SDRAM存储器中运行,在此模式下,工程文件仅由应用程序组成,不需要包含引导程序,程序编译完毕后由AXD调试软件通过JTAG口下载到SDRAM中,下载地址由ADS在程序编译前指定,其地址信息附加在编译后生成的.axf文件中。,4、应用程序编译为.axf 文件,下载到SDRAM存储器中运,11,4.3 软件系统开发概述,嵌入式系统的BootLoader,BootLoader类似于PC上的BIOS,是系统上电复位后,首先执行的一段程序,用以完成整个系统的启动和加载任务。,其功能主要是:,(1)初始化CPU、堆栈指针;,(2)配置存储映射,建立系统的编址空间映射,(3)跳转到应用程序或操作,4.3 软件系统开发概述嵌入式系统的BootLoader,12,2.BootLoader的开发模板,see also P123 图4.6,定义异常向量,初始化系统配置寄存器,第一次存储器映射,从Flash复制程序到ADRAM,第二次存储器映射,初始化堆栈指针,跳转到程序入口,2.BootLoader的开发模板定义异常向量初始化系统配,13,3.关于BootLoader开发模板的解释,1)定义异常向量,ARM处理器的硬件决定了处理器出现异常时PC指针会自动跳转到从0 x0到0 x1C的地址处运行,因此BootLoader应在这些地址放置跳转指令,使异常产生后程序能跳转到相应的异常处理程序。,2)初始化系统配置寄存器,系统配置寄存器SYSCFG决定了编址空间中特殊功能寄存器组的起始地址,以及片内SRAM的使用方式和起始地址,应首先对其初始化。,3.关于BootLoader开发模板的解释,14,3)进行第一次存储器映射(将SDRAM存储器映射到0X400000-0X1400000),系统复位后编址空间还没有进行初始化,只有Flash能够被访问,暂时无法读/写SDRAM,应首先通过对相关寄存器赋值,在编址空间和实际SDRAM物理设备之间建立映射关系,通过第一次存储器映射,将SDRAM存储器映射到0X400000-0X1400000,使得SDRAM处于正常读/写状态。,4)从Flash复制程序到SDRAM,第一次映射中已经将SDRAM映射到了地址0 x400000-0 x1400000处,由于SDRAM具有更快的读/写速度,在嵌入式系统中通常将程序从Flash复制到SDRAM中执行,这个工作由BootLoader完成。,3)进行第一次存储器映射(将SDRAM存储器映射到0X400,15,5)进行第二次存储器映射,和SDRAM相比,Flash读/写速度较慢,而ARM芯片的硬件构成决定了异常向量表必须放在0 x0处,如果将Flash映射到0 x0,将明显地减慢系统对异常的处理时间,另外,因为无法在Flash修改异常向量表,因此通常将异常向量表存放在SDRAM中,并把SDRAM的起始地址映射到0 x0处。,所以第二次存储器映射就是将SDRAM存储器从原地址0 x400000-0 x1400000处映射到0 x000000-0 x100000;将Flash存储器从原地址0 x0-0 x200000处映射到0 x1000000-0 x1200000。,6)初始化堆栈指针,对堆栈指针进行初始化,应首先确定堆栈指针工作方式,如满递减等,再根据应用程序中实际需要使用的堆栈大小进行设置。,5)进行第二次存储器映射,16,7)跳转到应用程序或操作系统入口,对于应用程序:,在汇编程序中导入应用程序中的函数标号,通过跳转指令可直接跳转到应用程序;,对于操作系统:,操作系统通常被烧写到Flash的固定地址处,初始化过程完成后跳转到操作系统的指定地址处即可。,NOTE:,在编写BootLoader程序时,可根据具体硬件配置,对图4.6中文件进行相应修改;,在使用BootLoader引导不同应用程序时,只需在main.c文件中添加相应的应用程序源代码即可。,7)跳转到应用程序或操作系统入口,17,4.开发BootLoader的主要方案,(1)获得相同型号CPU在其他开发板上的BootLoader,在此基础上修改;,(2)使用U-Boot、Redboot等通用BootLoader进行移植;,(3)根据功能需求自行编写BootLoader。,NOTE:,(1)如果硬件平台使用了常见的处理器型号,方案一、二能够高效、快捷地完成BootLoader设计。,因为ARM内核处理器应用广泛,在网络上即可下载到大多数型号的BootLoader,只需针对硬件参数进行修改即可。,(2)自行编写BootLoader程序需要熟练掌握处理器的中断方式、编址空间、寄存器配置等,且对汇编语言应用能力要求较高,因此方案三难度较大、采用较少。,(3)U-Boot(Universal BootLoader)具有源码开放、支持的处理器广泛(PowerPC、ARM、X86等),可靠性和稳定性好、设备驱动丰富(串口、以太网、SDRAM、Flash等)等特点,本书附录介绍了U-Boot的移植方法。,4.开发BootLoader的主要方案(1)获得相同型号CP,18,4.4 嵌入式系统引导程序,4.4.1 BootLoader概述,BootLoader是在系统启动初始化硬件设备、建立存储器映射,从而将系统的软、硬件环境带到一个合适状态的一段程序,类似于PC上的BIOS,是嵌入式软件系统的底层。,典型的BootLoader程序通常需要完成的任务:,(1)定义入口地址;,(2)建立异常中断处理向量;,(3)初始化堆栈指针;,(4)跳转到应用程序的主函数中或跳转到操作系统的启动地址。,4.4 嵌入式系统引导程序4.4.1 BootLoader概,19,4.4.2 s3c4510B编址空间和存储器映射,1.s3c4510b 编址空间,2.S3c4510b存储器映射,常用的5个系统管理寄存器:,1)ROM/
展开阅读全文