版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章无操作系统的应用软件开发第4章无操作系统的应用软件开发1嵌入式软件系统分为无操作系统和有操作系统。前者包括引导程序和应用程序,后者则在引导程序结束后运行操作系统,并将应用程序作为任务添加到操作系统中。NOTE:运行操作系统会占用大量宝贵的硬件资源,因此很多硬件资源有限、任务简单的嵌入式应用并不使用操作系统。嵌入式软件系统分为无操作系统和有操作系统。2嵌入式系统不管是否使用操作系统,都需要一段引导程序BootLoader来初始化硬件,为操作系统或应用程序的运行做准备。BootLoader是硬件与软件的桥梁,其作用就是初始化硬件设备、编址空间映射,建立系统软、硬件的正常工作状态。BootLoader的开发已经成为嵌入式系统教学和工程中的技术瓶颈。本章的内容:*介绍BootLoader的功能*分析s3c4510b的编址空间映射*分析BootLoader的启动过程*提出工程中BootLoader的解决方案。*用实例介绍不使用嵌入式操作系统的软件开发流程和代码固化方法。本章的目标:让读者能使用ADS开发一个完整的不使用操作系统的嵌入式系统。嵌入式系统不管是否使用操作系统,都需要一段引导程序BootL34.1软件开发数据流向图在不使用嵌入式操作系统的情况下,在ADS上能完成从BootLoader到应用程序的整个开发流程,使用JTAG仿真器进行调试,RS-232串口作为标准输入/输出,数据流向如P120图4.1所示。在调试阶段:使用ADS开发应用程序,编译生成带调试信息的.axf文件;用JTAG仿真器连接实验板和PC,将实验板上电,打开调试代理软件检测到ARM核处理器在AXD中使用setmem或obey命令设置CPU特殊功能寄存器配置存储空间;加载.axf文件到SDRAM存储器就可以调试运行了;利用AXD提供的单步、断点等调试手段,可以方便地查看CPU寄存器、存储器内容。
4.1软件开发数据流向图在不使用嵌入式操作系统的情况下,在4NOTE:*程序是在SDRAM里运行的,因此掉电后不能保存;*应用程序调试完毕后,将其加入BootLoader,编译生成不带调试信息的.bin文件,bin格式的映象文件只能全速运行;*烧写.bin文件需要一个专门的Flash烧写程序(扩展名为.axf)。*先采用上述调试软件的方法将烧写程序.axf文件加载到SDRAM,然后选择AXD的File菜单里面的LoadImage命令,将应用程序.bin文件加载到SDRAM的合适地址上,运行烧写程序,就能将.bin文件烧写到Flash存储器了。*在调试或烧写过程中,可以将必要信息通过RS-232串口输出到PC超级终端进行显示。NOTE:54.2无操作系统的软件运行模式不使用操作系统时,嵌入式软件系统包含引导程序和应用程序两个部分:(1)引导程序是嵌入式软件系统中必不可少的部分,完成硬件初始化、存储器空间映射和设置系统工作状态等工作。(2)应用程序则根据不同应用目的而编写。无操作系统下的各种软件运行模式的主要区别在于:引导程序和应用程序的各种组成方式。NOTE:
下面介绍的四种模式中采用的编址空间是经过二次存储器映射后的空间,在没有了解存储器的二次映射之前,只需要了解此图中各个部分的逻辑关系即可,不用去考虑物理地址。4.2无操作系统的软件运行模式不使用操作系统时,嵌入式软件系6
无操作系统的嵌入式软件运行模式:
1、应用程序和引导程序在一个工程中一起编译为一个.bin文件,烧写到Flash存储器地址0x0,引导程序运行结束后直接跳转到应用程序的入口处:(1)BootLoader启动后,Flash中的所有程序被复制到SDRAM存储器中,如图4.2P121(2)引导程序结束后就进入应用程序,这种跳转方式通过在引导程序中导入应用程序主函数名称来实现。(3)从汇编程序跳转到应用程序时,编译器会自动计算跳转的目的地址。。
7(4)跳转的代码如下:IMPORTC_Entry;导入应用程序的C_Entry函数BLC_Entry;跳转到该函数,跳转地址由编译器在编译时计算NOTE:应用程序存放到SDRAM的引导程序后,但其起始地址并不固定,在编译时,应用程序的起始地址随着引导程序的大小而变化。(4)跳转的代码如下:8
2、应用程序和引导程序分别编译为两个.bin文件,引导程序烧写到Flash存储器地址0x0,应用程序则烧写到存储器中的某个地址,引导程序运行结束后跳转到该地址运行应用程序
(1)BootLoader启动后,Flash中的所有程序被复制到SDRAM存储器中,如图4.3P121(2)引导程序结束后就进入应用程序,即将PC指针跳转到应用程序的起始地址,跳转的代码如下:LDRR1,=0X10000MOVPC,R1NOTE:
这种模式下,应用程序和引导程序被单独编译为两个.bin文件,因此应用程序可以灵活地烧写到任意地址处。本例中应用程序被烧写到0x10000为例。
2、应用程序和引导程序分别编译为两个.bin文件,引9
3、扩展引导程序,使其初始化功能结束后即可跳转到一个函数入口,也可以跳转到指定地址在此模式下,引导程序和其扩展的部分在一个工程中,编译为.bin文件,最后烧写到Flash存储器的地址0x0处,应用程序既可以随引导程序一起编译,也可以单独编译并下载到指定地址。如P122图4.4所示,引导程序完成后跳转到扩展程序中,可以进行串口初始化、人-机交互、按键判断、硬件电路自检、操作系统升级等功能,也可以根据输入命令跳转到相应程序或引导操作系统运行。这种模式集合了前两种模式的特点,启动过程较为灵活,并可以提供丰富的扩展功能,在实际工程中得到了广泛应用。常用的通用引导程序,如U-Boot等都是采用这种模式。3、扩展引导程序,使其初始化功能结束后即可跳转到一个104、应用程序编译为.axf文件,下载到SDRAM存储器中运行在此模式下,工程文件仅由应用程序组成,不需要包含引导程序,程序编译完毕后由AXD调试软件通过JTAG口下载到SDRAM中,下载地址由ADS在程序编译前指定,其地址信息附加在编译后生成的.axf文件中。4、应用程序编译为.axf文件,下载到SDRAM存储器中运114.3软件系统开发概述嵌入式系统的BootLoader
BootLoader类似于PC上的BIOS,是系统上电复位后,首先执行的一段程序,用以完成整个系统的启动和加载任务。其功能主要是:(1)初始化CPU、堆栈指针;(2)配置存储映射,建立系统的编址空间映射(3) 跳转到应用程序或操作4.3软件系统开发概述嵌入式系统的BootLoader122.BootLoader的开发模板seealsoP123图4.6定义异常向量初始化系统配置寄存器第一次存储器映射从Flash复制程序到ADRAM第二次存储器映射初始化堆栈指针跳转到程序入口2.BootLoader的开发模板定义异常向量初始化系统配133.关于BootLoader开发模板的解释
1)定义异常向量ARM处理器的硬件决定了处理器出现异常时PC指针会自动跳转到从0x0到0x1C的地址处运行,因此BootLoader应在这些地址放置跳转指令,使异常产生后程序能跳转到相应的异常处理程序。2)初始化系统配置寄存器系统配置寄存器SYSCFG决定了编址空间中特殊功能寄存器组的起始地址,以及片内SRAM的使用方式和起始地址,应首先对其初始化。3.关于BootLoader开发模板的解释143)进行第一次存储器映射(将SDRAM存储器映射到0X400000-0X1400000)系统复位后编址空间还没有进行初始化,只有Flash能够被访问,暂时无法读/写SDRAM,应首先通过对相关寄存器赋值,在编址空间和实际SDRAM物理设备之间建立映射关系,通过第一次存储器映射,将SDRAM存储器映射到0X400000-0X1400000,使得SDRAM处于正常读/写状态。4)从Flash复制程序到SDRAM第一次映射中已经将SDRAM映射到了地址0x400000-0x1400000处,由于SDRAM具有更快的读/写速度,在嵌入式系统中通常将程序从Flash复制到SDRAM中执行,这个工作由BootLoader完成。3)进行第一次存储器映射(将SDRAM存储器映射到0X400155)进行第二次存储器映射和SDRAM相比,Flash读/写速度较慢,而ARM芯片的硬件构成决定了异常向量表必须放在0x0处,如果将Flash映射到0x0,将明显地减慢系统对异常的处理时间,另外,因为无法在Flash修改异常向量表,因此通常将异常向量表存放在SDRAM中,并把SDRAM的起始地址映射到0x0处。所以第二次存储器映射就是将SDRAM存储器从原地址0x400000-0x1400000处映射到0x000000-0x100000;将Flash存储器从原地址0x0-0x200000处映射到0x1000000-0x1200000。6)初始化堆栈指针对堆栈指针进行初始化,应首先确定堆栈指针工作方式,如满递减等,再根据应用程序中实际需要使用的堆栈大小进行设置。5)进行第二次存储器映射167)跳转到应用程序或操作系统入口
对于应用程序:
在汇编程序中导入应用程序中的函数标号,通过跳转指令可直接跳转到应用程序;对于操作系统:操作系统通常被烧写到Flash的固定地址处,初始化过程完成后跳转到操作系统的指定地址处即可。NOTE:在编写BootLoader程序时,可根据具体硬件配置,对图4.6中文件进行相应修改;在使用BootLoader引导不同应用程序时,只需在main.c文件中添加相应的应用程序源代码即可。
7)跳转到应用程序或操作系统入口174.开发BootLoader的主要方案(1)获得相同型号CPU在其他开发板上的BootLoader,在此基础上修改;(2)使用U-Boot、Redboot等通用BootLoader进行移植;(3)根据功能需求自行编写BootLoader。NOTE:(1)如果硬件平台使用了常见的处理器型号,方案一、二能够高效、快捷地完成BootLoader设计。因为ARM内核处理器应用广泛,在网络上即可下载到大多数型号的BootLoader,只需针对硬件参数进行修改即可。(2)自行编写BootLoader程序需要熟练掌握处理器的中断方式、编址空间、寄存器配置等,且对汇编语言应用能力要求较高,因此方案三难度较大、采用较少。(3)U-Boot(UniversalBootLoader)具有源码开放、支持的处理器广泛(PowerPC、ARM、X86等),可靠性和稳定性好、设备驱动丰富(串口、以太网、SDRAM、Flash等)等特点,本书附录介绍了U-Boot的移植方法。4.开发BootLoader的主要方案(1)获得相同型号CP184.4嵌入式系统引导程序4.4.1BootLoader概述BootLoader是在系统启动初始化硬件设备、建立存储器映射,从而将系统的软、硬件环境带到一个合适状态的一段程序,类似于PC上的BIOS,是嵌入式软件系统的底层。
典型的BootLoader程序通常需要完成的任务:
(1)定义入口地址;(2)建立异常中断处理向量;(3)初始化堆栈指针;(4)跳转到应用程序的主函数中或跳转到操作系统的启动地址。4.4嵌入式系统引导程序4.4.1BootLoader概194.4.2s3c4510B编址空间和存储器映射
1.s3c4510b编址空间2.S3c4510b存储器映射常用的5个系统管理寄存器:1)ROM/SRAM/Flash控制寄存器ROMCONn2)DRAM/SDRAM控制寄存器DRAMCONn3)系统配置寄存器SYSCFG4)数据总线宽度寄存器EXTDBWTH5)DRAMA刷新与外部I/O控制寄存器REFEXTCON4.4.2s3c4510B编址空间和存储器映射204.4.3BootLoader启动过程分析
1、BootLoader是高度依赖于硬件的,针对不同的硬件配置,其实现方式也各不相同。2、以一段s3c4510b的初始化代码为例进行分析,其启动过程分为7个步骤:(1)定义异常向量;(2)初始化系统配置寄存器;(3)进行第一次存储器映射(将SDRAM存储器映射到0x400000-0x1400000);(4)从Flash复制程序到SDRAM;(5)进行第二次存储器映射(将SDRAM存储器从原地址0x400000-0x1400000处映射到0x0-0x1000000;将Flash存储器从原地址0x0-0x200000处映射到0x1200000-0x1400000);(6)初始化堆栈指针;(7)跳转到C语言程序(应用程序或操作系统入口)
4.4.3BootLoader启动过程分析
1、Boo213、系统上电后的映射关系:图4.10P1323、系统上电后的映射关系:224、BootLoader启动过程分析
补充:关于伪指令EQU语法格式:名称EQU表达式{,类型}EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替。“名称”为EQU伪指令定义的字符名称,当“表达式”为32位的常量时,可以指定表达式的数据类型,有以下三种类型:CODE16、CODE32和DATA使用示例:(1)TestEQU50;定义标号Test的值为50(2)AddrEQU0x55,CODE32;定义Addr的值为0x55,且该处为32位的ARM指令。
4、BootLoader启动过程分析230)系统默认从Flash的0x0地址处开始执行程序,因此首先要进行SDRAM映射SYSCFGEQU0X3FF0000;系统配置寄存器地址EXTDBWTHEQUOX3FF3010;数据宽度寄存器地址ROMCON0EQUOX3FF3014;Flash配置寄存器地址SDRAMCON0EQUOX3FF302C;SDRAM配置寄存器地址REFEXTCONEQUOX3FF303C;刷新和外部I/O寄存器地址0)系统默认从Flash的0x0地址处开始执行程序,因此首24
rSYSCFGEQU0XE7FFFF90;系统配置寄存器的赋值
rEXTDBWTHEQUOX00003002;数据宽度寄存器的赋值
rREFEXTCONEQUOXCE338360;刷新和外部I/O寄存器的赋值;第一次映射时,Flash和SDRAM配置寄存器的赋值
rfROMCON0EQUOX02000060
rfSDRAMCON0EQUOX14010380;第二次映射时,Flash和SDRAM配置寄存器的赋值
rsROMCON0EQUOX14048060
rsSDRAMCON0EQUOX10000380
无操作系统的应用程序开发精编课件25;没有使用的存储器组,赋值为0rROMCON1EQU0X0rROMCON2EQU0X0rROMCON3EQU0X0rROMCON4EQU0X0rROMCON5EQU0X0rSDRAMCON1EQU0X0rSDRAMCON2EQU0X0rSDRAMCON3EQU0X0;没有使用的存储器组,赋值为026IOPMODEQU0X3FF5000;GPIO模式寄存器IOPCONEQU0X3FF5004;GPIO配置寄存器IOPDATAEQU0X3FF5008;GPIO数据寄存器IOPMODEQU0X3FF5000;27;1)定义异常向量CODE32AREAInit,CODE,READONLY;定义为代码段ENTRY;程序入口BReset_Handler;启动后跳转到标号Reset_Handler处;以下7条NOP语句分别对应7个中断向量,因为不使用中断,此处定义异常向量表为空。NOP;未定义指令中断NOP;软件中断NOP;预取指令终止NOP;数据终止NOP;保留BIRQHandler;IRQ中断NOP;FIQ中断NOTE:
没有使用中断时,在中断向量表处可存放NOP指令,需要使用中断向量,如IRQ中断时,在相应的中断向量地址处存放一条跳转到中断服务程序的跳转指令即可。
;1)定义异常向量282)初始化系统配置寄存器、数据宽度寄存器Reset_Handler;初始化syscfg寄存器;[5:4]Cache模式01=0KBSRAM,8KBCache;[25:16]特殊功能寄存器组的基指针1111111111=0x3ffLDRR1,=SYSCFG;代表什么?观察寄存器、存储器的内容LDRR0,=rSYSCFG;STRR0,[R1];R0->[R1];初始化EXTDBWTH寄存器,Rextdbwth=0x00003002;[1:0]Flash组0的数据总线宽度=1016位;[13:12]DRAM组0的数据总线宽度=1132位LDRR1,=EXTDBWTH;LDRR0,=rEXTDBWTH;STRR0,[R1];R0->[R1]NOTE:系统配置寄存器SYSCFG的地址为0x3FF0000;数据宽度寄存器EXTDBWTH的地址为0x3FF3010。SYSCFG的作用主要是定义怎样使用处理器的片内资源;EXTDBWTH的作用是定义外部资源的数据宽度,同时也让系统了解了外部硬件连接情况。2)初始化系统配置寄存器、数据宽度寄存器293)进行第一次存储器映射映射的作用就是将外部物理设备映射到相应的地址范围。bootloader中使用了两次映射,其本质就是给两个相应的寄存器赋值,它们是:Flash控制寄存器ROMCON,地址为0x3FF3014;SDRAM控制寄存器DRAMCON,地址为0x3FF302C。LDRr0,=ROMCON0;r0中存放STMIA指令的目的地址;rfROMCON0=0x02000060;[19:10]Flash组基指针0x0;[29:20]Flash组尾指针0x200000LDRr1,=rfROMCON0;将头文件中定义的寄存器赋值写入寄存器LDRr2,=rROMCON1LDRr3,=rROMCON2LDRr4,=rROMCON3LDRr5,=rROMCON4LDRr6,=rROMCON53)进行第一次存储器映射30;rfSDRAMCON0=0x14010380;[19:10]DRAM组基指针=01000000,即地址为0x400000;[29:20]DRAM组尾指针=0101000000,即地址为0x1400000LDRr7,=rSDRAMCON0
LDRr8,=rSDRAMCON1LDRr9,=rSDRAMCON2LDRr10,=rSDRAMCON3LDRr11,=rREFEXTCON;将r1-r11的赋值一次性写入以r0为开始地址的存储单元STMIAr0,{r1-r11}
NOTE:(1)这段程序执行完后,系统的地址空间映射如P135图4.11所示。(2)此段程序中兰色标注的两小段的作用是?它们好象属于没有使用的存储器组,那能删掉吗?;rfSDRAMCON0=0从Flash复制程序到SDRAM原因:当程序在SDRAM中运行时速度快,但不能掉电保护;程序在flash中运行时,可以掉电保护,但运行速度慢,且中断无法修改;该步骤集二者之长,既可以在SDRAM中运行,又可以进行掉电保护。LDRr0,=0x0;初始化复制数据的源地址LDRr1,=0x200000;初始化循环次数LDRr2,=0x400000;初始化复制数据的目的地址rom2ram_copy_loop;子程序标号,此子程序作用就是把程序从Flash复制到SDRAMLDRr3,[r0],#4;加载指令,将以[r0]为地址的存储单元的数据送到寄存器r3,修改r0的值即r0+4->r0,让它指向下一个存储单元。STRr3,[r2],#4;存储指令,将寄存器r3存放的数据送到以[r2]为地址的存储单元,修改r2的值即r2+4->r2,让它指向下一个存储单元。SUBSr1,r1,#4BNErom2ram_copy_loop4)从Flash复制程序到SDRAM32
执行完这段程序后,可以暂停BootLoader程序,打开AXD调试程序观察系统存储器窗口,如P136图4.13所示,可以看到地址为0x0处为Flash存储器,其中保存着BootLoader程序,而地址0x400000处为SDRAM存储器,其中也保存着和Flash完全相同的程序。5)进行第二次存储器映射
seealsoP136问题:第一、二次存储器映射的相同与不同?
执行完这段程序后,可以暂停BootLo336)初始化堆栈指针
在引导程序运行前,堆栈指针必须被初始化。堆栈指针的初始化涉及到CPSR_C和SP两个寄存器。通过对CPSR_C的赋值来实现处理器模式的转换;而对SP赋值来实现在不同模式下对堆栈指针的初始化。
;设置IRQ堆栈指针MOVr0,#0x12MSRcpsr_c,r0;MSR-通用寄存器到程序状态寄存器的数据传送指令;传送r0的内容到cpsr,但仅修改cpsr中的控制位域;切换到IRQ模式
MOVsp,=0x700000;为堆栈指针寄存器赋值
;设置FIQ堆栈指针MOVr0,#0x11MSRcpsr_c,r0;切换到FIQ模式
LDRsp,=0x7f0000;为堆栈指针寄存器赋值;设置SVC堆栈指针MOVr0,#0x13MSRcpsr_c,r0;切换到SVC模式
LDRsp,=0x800000;为堆栈指针寄存器赋值问题:(1)程序中红色标注指令都是为堆栈指针寄存器赋值,它们有啥异同?(2)从图4.17可以看出:堆栈是用什么来充当的?
6)初始化堆栈指针347)引导应用程序时,跳转到应用程序中的主函数中:IMPORTC_Entry;跳转到main函数BLC_EntryEND引导操作系统时,跳转到操作系统的启动地址处(uClinux为0x10000)LDRpc,=0x10000END7)引导应用程序时,跳转到应用程序中的主函数中:354.5无操作系统下单任务应用程序的开发1、无操作系统的优、缺点无操作系统相当于裸机,资源利用少,运行速度快;无操作系统只适合单任务或简单多任务的应用程序的开发;而对于复杂多任务的嵌入式系统,无操作系统会大大增加开发难度。4.5无操作系统下单任务应用程序的开发1、无操作系统的优、362、开发流程:编写.s、.c文件编译,生成.axf文件硬件调试按复位键,实现上电自启动通过H-flash将.bin文件添加到flash中编译,生成.bin文件添加Bootloader到.s源文件中2、开发流程:编写.s、.c文件编译,生成.axf文件硬件37也可以说,开发应用程序可分为两个阶段:(1)在调试阶段,将应用程序编译为.axf文件,下载到SDRAM运行,在此过程中可对应用程序使用单步、断点等调试手段进行调试;(2)将BootLoader引导程序添加到工程中,编译工程生成.bin文件,烧写到Flash存储器中,完成应用程序开发。也可以说,开发应用程序可分为两个阶段:383、.s文件中添加Bootloader关于硬件调试前面已经讲过,这里不再复述。调试成功后,添加Bootloader的目的是将程序固化,实现上电自启动。简单的说,就是删除先前.s文件中的代码段和入口点定义两行,再将它放到Bootloader的堆栈初始化之后。3、.s文件中添加Bootloader394、编译编译的过程跟硬件调试的一样,只是设置有所区别,主要别如下:在DebugRelSettings->ARMLinker中:Output选项卡的R0Base下面一栏中填“0x0”;Layout选项卡的Object/SYmbol下面一栏中填“Init.o”;Section下面一栏中填“Init”。4、编译405、.bin下载到Flash首先要对H-Flash进行相应的设置,书上已有详细的讲解,为了避免每次实验重复设置,可将设置保存到一个.hfc文件中,以后需要设置时加载此文件即可。HOW?在加载前,还需要对programming->Type进行下载文件类型的选择;programming->DstAddr一栏中填写下载的目标地址。5、.bin下载到Flash414.6固化程序到Flash存储器两种方法:(1)使用H-JTAG烧写Flash(第三章已讲)(2)编写Flash烧写程序烧写Flash要求:熟练掌握两种方法4.6固化程序到Flash存储器两种方法:42编写Flash烧写程序烧写Flash
烧写程序到Flash的过程是将待烧写文件和烧写程序分别下载到SDRAM中,运行烧写程序。烧写程序将待烧写文件搬运到Flash中的指定地址中。编写Flash烧写程序烧写Flash烧写程43编写Flash烧写程序算法思想:(1)整片擦除Flash存储器;(2)将SDRAM中0x500000地址起始处的内容按字复制到Flash的0x0地址起始处,每复制一个字,判断是否有效,如果有效则地址递增,继续复制下一个字的内容,直至所有内容复制完。NOTE:(1)在整个过程中,将指示信息通过串口打印到超级终端显示;(2)程序中用来标志系统中Flash存储器的起始物理地址FLASH_START_ADDR,在此例中假定Flash存储器的起始物理地址为0x0,当把Flash存储器映射到其他的地址空间,应修改FLASH_START_ADDR的值。编写Flash烧写程序算法思想:44烧写流程(1)将实验板上电,并连接实验板和PC,在PC端首先打开调试代理程序,再打开AXD调试代理软件,执行obey命令,将SDRAM映射到0X400000-0X1400000,将Flash映射到0X0-0X200000;(2)在AXD中装载烧写程序.axf映像文件,执行File菜单里的LoadImage命令,加载Flash烧写程序映像到SDRAM存储器;(3)在AXD中装载待烧写程序的.bin文件到SDRAM中,与.axf文件不同,.bin文件是应用程序的二进制代码文件,不含有调试信息,因此装载方法和.axf文件不同,装载.bin文件时还应该指定程序下载到SDRAM中的地址,执行File菜单里的LoadMemoryFromFile命令,选择要加载的文件,并填写装载地址。(4)在AXD中运行烧写程序,烧写程序将.bin文件烧写到Flash中。烧写流程(1)将实验板上电,并连接实验板和PC,在PC端首先45文件类型总结:.s:汇编语言源文件;.c:c语言源文件;.mcp:工程文件;.bin:二进制文件;.axf:映像文件;.o文件:目标文件.his:H-JTAG的配置文件;.hfc:H-Flasher的配置文件。文件类型总结:46第4章无操作系统的应用软件开发第4章无操作系统的应用软件开发47嵌入式软件系统分为无操作系统和有操作系统。前者包括引导程序和应用程序,后者则在引导程序结束后运行操作系统,并将应用程序作为任务添加到操作系统中。NOTE:运行操作系统会占用大量宝贵的硬件资源,因此很多硬件资源有限、任务简单的嵌入式应用并不使用操作系统。嵌入式软件系统分为无操作系统和有操作系统。48嵌入式系统不管是否使用操作系统,都需要一段引导程序BootLoader来初始化硬件,为操作系统或应用程序的运行做准备。BootLoader是硬件与软件的桥梁,其作用就是初始化硬件设备、编址空间映射,建立系统软、硬件的正常工作状态。BootLoader的开发已经成为嵌入式系统教学和工程中的技术瓶颈。本章的内容:*介绍BootLoader的功能*分析s3c4510b的编址空间映射*分析BootLoader的启动过程*提出工程中BootLoader的解决方案。*用实例介绍不使用嵌入式操作系统的软件开发流程和代码固化方法。本章的目标:让读者能使用ADS开发一个完整的不使用操作系统的嵌入式系统。嵌入式系统不管是否使用操作系统,都需要一段引导程序BootL494.1软件开发数据流向图在不使用嵌入式操作系统的情况下,在ADS上能完成从BootLoader到应用程序的整个开发流程,使用JTAG仿真器进行调试,RS-232串口作为标准输入/输出,数据流向如P120图4.1所示。在调试阶段:使用ADS开发应用程序,编译生成带调试信息的.axf文件;用JTAG仿真器连接实验板和PC,将实验板上电,打开调试代理软件检测到ARM核处理器在AXD中使用setmem或obey命令设置CPU特殊功能寄存器配置存储空间;加载.axf文件到SDRAM存储器就可以调试运行了;利用AXD提供的单步、断点等调试手段,可以方便地查看CPU寄存器、存储器内容。
4.1软件开发数据流向图在不使用嵌入式操作系统的情况下,在50NOTE:*程序是在SDRAM里运行的,因此掉电后不能保存;*应用程序调试完毕后,将其加入BootLoader,编译生成不带调试信息的.bin文件,bin格式的映象文件只能全速运行;*烧写.bin文件需要一个专门的Flash烧写程序(扩展名为.axf)。*先采用上述调试软件的方法将烧写程序.axf文件加载到SDRAM,然后选择AXD的File菜单里面的LoadImage命令,将应用程序.bin文件加载到SDRAM的合适地址上,运行烧写程序,就能将.bin文件烧写到Flash存储器了。*在调试或烧写过程中,可以将必要信息通过RS-232串口输出到PC超级终端进行显示。NOTE:514.2无操作系统的软件运行模式不使用操作系统时,嵌入式软件系统包含引导程序和应用程序两个部分:(1)引导程序是嵌入式软件系统中必不可少的部分,完成硬件初始化、存储器空间映射和设置系统工作状态等工作。(2)应用程序则根据不同应用目的而编写。无操作系统下的各种软件运行模式的主要区别在于:引导程序和应用程序的各种组成方式。NOTE:
下面介绍的四种模式中采用的编址空间是经过二次存储器映射后的空间,在没有了解存储器的二次映射之前,只需要了解此图中各个部分的逻辑关系即可,不用去考虑物理地址。4.2无操作系统的软件运行模式不使用操作系统时,嵌入式软件系52
无操作系统的嵌入式软件运行模式:
1、应用程序和引导程序在一个工程中一起编译为一个.bin文件,烧写到Flash存储器地址0x0,引导程序运行结束后直接跳转到应用程序的入口处:(1)BootLoader启动后,Flash中的所有程序被复制到SDRAM存储器中,如图4.2P121(2)引导程序结束后就进入应用程序,这种跳转方式通过在引导程序中导入应用程序主函数名称来实现。(3)从汇编程序跳转到应用程序时,编译器会自动计算跳转的目的地址。。
53(4)跳转的代码如下:IMPORTC_Entry;导入应用程序的C_Entry函数BLC_Entry;跳转到该函数,跳转地址由编译器在编译时计算NOTE:应用程序存放到SDRAM的引导程序后,但其起始地址并不固定,在编译时,应用程序的起始地址随着引导程序的大小而变化。(4)跳转的代码如下:54
2、应用程序和引导程序分别编译为两个.bin文件,引导程序烧写到Flash存储器地址0x0,应用程序则烧写到存储器中的某个地址,引导程序运行结束后跳转到该地址运行应用程序
(1)BootLoader启动后,Flash中的所有程序被复制到SDRAM存储器中,如图4.3P121(2)引导程序结束后就进入应用程序,即将PC指针跳转到应用程序的起始地址,跳转的代码如下:LDRR1,=0X10000MOVPC,R1NOTE:
这种模式下,应用程序和引导程序被单独编译为两个.bin文件,因此应用程序可以灵活地烧写到任意地址处。本例中应用程序被烧写到0x10000为例。
2、应用程序和引导程序分别编译为两个.bin文件,引55
3、扩展引导程序,使其初始化功能结束后即可跳转到一个函数入口,也可以跳转到指定地址在此模式下,引导程序和其扩展的部分在一个工程中,编译为.bin文件,最后烧写到Flash存储器的地址0x0处,应用程序既可以随引导程序一起编译,也可以单独编译并下载到指定地址。如P122图4.4所示,引导程序完成后跳转到扩展程序中,可以进行串口初始化、人-机交互、按键判断、硬件电路自检、操作系统升级等功能,也可以根据输入命令跳转到相应程序或引导操作系统运行。这种模式集合了前两种模式的特点,启动过程较为灵活,并可以提供丰富的扩展功能,在实际工程中得到了广泛应用。常用的通用引导程序,如U-Boot等都是采用这种模式。3、扩展引导程序,使其初始化功能结束后即可跳转到一个564、应用程序编译为.axf文件,下载到SDRAM存储器中运行在此模式下,工程文件仅由应用程序组成,不需要包含引导程序,程序编译完毕后由AXD调试软件通过JTAG口下载到SDRAM中,下载地址由ADS在程序编译前指定,其地址信息附加在编译后生成的.axf文件中。4、应用程序编译为.axf文件,下载到SDRAM存储器中运574.3软件系统开发概述嵌入式系统的BootLoader
BootLoader类似于PC上的BIOS,是系统上电复位后,首先执行的一段程序,用以完成整个系统的启动和加载任务。其功能主要是:(1)初始化CPU、堆栈指针;(2)配置存储映射,建立系统的编址空间映射(3) 跳转到应用程序或操作4.3软件系统开发概述嵌入式系统的BootLoader582.BootLoader的开发模板seealsoP123图4.6定义异常向量初始化系统配置寄存器第一次存储器映射从Flash复制程序到ADRAM第二次存储器映射初始化堆栈指针跳转到程序入口2.BootLoader的开发模板定义异常向量初始化系统配593.关于BootLoader开发模板的解释
1)定义异常向量ARM处理器的硬件决定了处理器出现异常时PC指针会自动跳转到从0x0到0x1C的地址处运行,因此BootLoader应在这些地址放置跳转指令,使异常产生后程序能跳转到相应的异常处理程序。2)初始化系统配置寄存器系统配置寄存器SYSCFG决定了编址空间中特殊功能寄存器组的起始地址,以及片内SRAM的使用方式和起始地址,应首先对其初始化。3.关于BootLoader开发模板的解释603)进行第一次存储器映射(将SDRAM存储器映射到0X400000-0X1400000)系统复位后编址空间还没有进行初始化,只有Flash能够被访问,暂时无法读/写SDRAM,应首先通过对相关寄存器赋值,在编址空间和实际SDRAM物理设备之间建立映射关系,通过第一次存储器映射,将SDRAM存储器映射到0X400000-0X1400000,使得SDRAM处于正常读/写状态。4)从Flash复制程序到SDRAM第一次映射中已经将SDRAM映射到了地址0x400000-0x1400000处,由于SDRAM具有更快的读/写速度,在嵌入式系统中通常将程序从Flash复制到SDRAM中执行,这个工作由BootLoader完成。3)进行第一次存储器映射(将SDRAM存储器映射到0X400615)进行第二次存储器映射和SDRAM相比,Flash读/写速度较慢,而ARM芯片的硬件构成决定了异常向量表必须放在0x0处,如果将Flash映射到0x0,将明显地减慢系统对异常的处理时间,另外,因为无法在Flash修改异常向量表,因此通常将异常向量表存放在SDRAM中,并把SDRAM的起始地址映射到0x0处。所以第二次存储器映射就是将SDRAM存储器从原地址0x400000-0x1400000处映射到0x000000-0x100000;将Flash存储器从原地址0x0-0x200000处映射到0x1000000-0x1200000。6)初始化堆栈指针对堆栈指针进行初始化,应首先确定堆栈指针工作方式,如满递减等,再根据应用程序中实际需要使用的堆栈大小进行设置。5)进行第二次存储器映射627)跳转到应用程序或操作系统入口
对于应用程序:
在汇编程序中导入应用程序中的函数标号,通过跳转指令可直接跳转到应用程序;对于操作系统:操作系统通常被烧写到Flash的固定地址处,初始化过程完成后跳转到操作系统的指定地址处即可。NOTE:在编写BootLoader程序时,可根据具体硬件配置,对图4.6中文件进行相应修改;在使用BootLoader引导不同应用程序时,只需在main.c文件中添加相应的应用程序源代码即可。
7)跳转到应用程序或操作系统入口634.开发BootLoader的主要方案(1)获得相同型号CPU在其他开发板上的BootLoader,在此基础上修改;(2)使用U-Boot、Redboot等通用BootLoader进行移植;(3)根据功能需求自行编写BootLoader。NOTE:(1)如果硬件平台使用了常见的处理器型号,方案一、二能够高效、快捷地完成BootLoader设计。因为ARM内核处理器应用广泛,在网络上即可下载到大多数型号的BootLoader,只需针对硬件参数进行修改即可。(2)自行编写BootLoader程序需要熟练掌握处理器的中断方式、编址空间、寄存器配置等,且对汇编语言应用能力要求较高,因此方案三难度较大、采用较少。(3)U-Boot(UniversalBootLoader)具有源码开放、支持的处理器广泛(PowerPC、ARM、X86等),可靠性和稳定性好、设备驱动丰富(串口、以太网、SDRAM、Flash等)等特点,本书附录介绍了U-Boot的移植方法。4.开发BootLoader的主要方案(1)获得相同型号CP644.4嵌入式系统引导程序4.4.1BootLoader概述BootLoader是在系统启动初始化硬件设备、建立存储器映射,从而将系统的软、硬件环境带到一个合适状态的一段程序,类似于PC上的BIOS,是嵌入式软件系统的底层。
典型的BootLoader程序通常需要完成的任务:
(1)定义入口地址;(2)建立异常中断处理向量;(3)初始化堆栈指针;(4)跳转到应用程序的主函数中或跳转到操作系统的启动地址。4.4嵌入式系统引导程序4.4.1BootLoader概654.4.2s3c4510B编址空间和存储器映射
1.s3c4510b编址空间2.S3c4510b存储器映射常用的5个系统管理寄存器:1)ROM/SRAM/Flash控制寄存器ROMCONn2)DRAM/SDRAM控制寄存器DRAMCONn3)系统配置寄存器SYSCFG4)数据总线宽度寄存器EXTDBWTH5)DRAMA刷新与外部I/O控制寄存器REFEXTCON4.4.2s3c4510B编址空间和存储器映射664.4.3BootLoader启动过程分析
1、BootLoader是高度依赖于硬件的,针对不同的硬件配置,其实现方式也各不相同。2、以一段s3c4510b的初始化代码为例进行分析,其启动过程分为7个步骤:(1)定义异常向量;(2)初始化系统配置寄存器;(3)进行第一次存储器映射(将SDRAM存储器映射到0x400000-0x1400000);(4)从Flash复制程序到SDRAM;(5)进行第二次存储器映射(将SDRAM存储器从原地址0x400000-0x1400000处映射到0x0-0x1000000;将Flash存储器从原地址0x0-0x200000处映射到0x1200000-0x1400000);(6)初始化堆栈指针;(7)跳转到C语言程序(应用程序或操作系统入口)
4.4.3BootLoader启动过程分析
1、Boo673、系统上电后的映射关系:图4.10P1323、系统上电后的映射关系:684、BootLoader启动过程分析
补充:关于伪指令EQU语法格式:名称EQU表达式{,类型}EQU伪指令用于为程序中的常量、标号等定义一个等效的字符名称,类似于C语言中的#define。其中EQU可用“*”代替。“名称”为EQU伪指令定义的字符名称,当“表达式”为32位的常量时,可以指定表达式的数据类型,有以下三种类型:CODE16、CODE32和DATA使用示例:(1)TestEQU50;定义标号Test的值为50(2)AddrEQU0x55,CODE32;定义Addr的值为0x55,且该处为32位的ARM指令。
4、BootLoader启动过程分析690)系统默认从Flash的0x0地址处开始执行程序,因此首先要进行SDRAM映射SYSCFGEQU0X3FF0000;系统配置寄存器地址EXTDBWTHEQUOX3FF3010;数据宽度寄存器地址ROMCON0EQUOX3FF3014;Flash配置寄存器地址SDRAMCON0EQUOX3FF302C;SDRAM配置寄存器地址REFEXTCONEQUOX3FF303C;刷新和外部I/O寄存器地址0)系统默认从Flash的0x0地址处开始执行程序,因此首70
rSYSCFGEQU0XE7FFFF90;系统配置寄存器的赋值
rEXTDBWTHEQUOX00003002;数据宽度寄存器的赋值
rREFEXTCONEQUOXCE338360;刷新和外部I/O寄存器的赋值;第一次映射时,Flash和SDRAM配置寄存器的赋值
rfROMCON0EQUOX02000060
rfSDRAMCON0EQUOX14010380;第二次映射时,Flash和SDRAM配置寄存器的赋值
rsROMCON0EQUOX14048060
rsSDRAMCON0EQUOX10000380
无操作系统的应用程序开发精编课件71;没有使用的存储器组,赋值为0rROMCON1EQU0X0rROMCON2EQU0X0rROMCON3EQU0X0rROMCON4EQU0X0rROMCON5EQU0X0rSDRAMCON1EQU0X0rSDRAMCON2EQU0X0rSDRAMCON3EQU0X0;没有使用的存储器组,赋值为072IOPMODEQU0X3FF5000;GPIO模式寄存器IOPCONEQU0X3FF5004;GPIO配置寄存器IOPDATAEQU0X3FF5008;GPIO数据寄存器IOPMODEQU0X3FF5000;73;1)定义异常向量CODE32AREAInit,CODE,READONLY;定义为代码段ENTRY;程序入口BReset_Handler;启动后跳转到标号Reset_Handler处;以下7条NOP语句分别对应7个中断向量,因为不使用中断,此处定义异常向量表为空。NOP;未定义指令中断NOP;软件中断NOP;预取指令终止NOP;数据终止NOP;保留BIRQHandler;IRQ中断NOP;FIQ中断NOTE:
没有使用中断时,在中断向量表处可存放NOP指令,需要使用中断向量,如IRQ中断时,在相应的中断向量地址处存放一条跳转到中断服务程序的跳转指令即可。
;1)定义异常向量742)初始化系统配置寄存器、数据宽度寄存器Reset_Handler;初始化syscfg寄存器;[5:4]Cache模式01=0KBSRAM,8KBCache;[25:16]特殊功能寄存器组的基指针1111111111=0x3ffLDRR1,=SYSCFG;代表什么?观察寄存器、存储器的内容LDRR0,=rSYSCFG;STRR0,[R1];R0->[R1];初始化EXTDBWTH寄存器,Rextdbwth=0x00003002;[1:0]Flash组0的数据总线宽度=1016位;[13:12]DRAM组0的数据总线宽度=1132位LDRR1,=EXTDBWTH;LDRR0,=rEXTDBWTH;STRR0,[R1];R0->[R1]NOTE:系统配置寄存器SYSCFG的地址为0x3FF0000;数据宽度寄存器EXTDBWTH的地址为0x3FF3010。SYSCFG的作用主要是定义怎样使用处理器的片内资源;EXTDBWTH的作用是定义外部资源的数据宽度,同时也让系统了解了外部硬件连接情况。2)初始化系统配置寄存器、数据宽度寄存器753)进行第一次存储器映射映射的作用就是将外部物理设备映射到相应的地址范围。bootloader中使用了两次映射,其本质就是给两个相应的寄存器赋值,它们是:Flash控制寄存器ROMCON,地址为0x3FF3014;SDRAM控制寄存器DRAMCON,地址为0x3FF302C。LDRr0,=ROMCON0;r0中存放STMIA指令的目的地址;rfROMCON0=0x02000060;[19:10]Flash组基指针0x0;[29:20]Flash组尾指针0x200000LDRr1,=rfROMCON0;将头文件中定义的寄存器赋值写入寄存器LDRr2,=rROMCON1LDRr3,=rROMCON2LDRr4,=rROMCON3LDRr5,=rROMCON4LDRr6,=rROMCON53)进行第一次存储器映射76;rfSDRAMCON0=0x14010380;[19:10]DRAM组基指针=01000000,即地址为0x400000;[29:20]DRAM组尾指针=0101000000,即地址为0x1400000LDRr7,=rSDRAMCON0
LDRr8,=rSDRAMCON1LDRr9,=rSDRAMCON2LDRr10,=rSDRAMCON3LDRr11,=rREFEXTCON;将r1-r11的赋值一次性写入以r0为开始地址的存储单元STMIAr0,{r1-r11}
NOTE:(1)这段程序执行完后,系统的地址空间映射如P135图4.11所示。(2)此段程序中兰色标注的两小段的作用是?它们好象属于没有使用的存储器组,那能删掉吗?;rfSDRAMCON0=0从Flash复制程序到SDRAM原因:当程序在SDRAM中运行时速度快,但不能掉电保护;程序在flash中运行时,可以掉电保护,但运行速度慢,且中断无法修改;该步骤集二者之长,既可以在SDRAM中运行,又可以进行掉电保护。LDRr0,=0x0;初始化复制数据的源地址LDRr1,=0x200000;初始化循环次数LDRr2,=0x400000;初始化复制数据的目的地址rom2ram_copy_loop;子程序标号,此子程序作用就是把程序从Flash复制到SDRAMLDRr3,[r0],#4;加载指令,将以[r0]为地址的存储单元的数据送到寄存器r3,修改r0的值即r0+4->r0,让它指向下一个存储单元。STRr3,[r2],#4;存储指令,将寄存器r3存放的数据送到以[r2]为地址的存储单元,修改r2的值即r2+4->r2,让它指向下一个存储单元。SUBSr1,r1,#4BNErom2ram_copy_loop4)从Flash复制程序到SDRAM78
执行完这段程序后,可以暂停BootLoader程序,打开AXD调试程序观察系统存储器窗口,如P136图4.13所示,可以看到地址为0x0处为Flash存储器,其中保存着BootLoader程序,而地址0x400000处为SDRAM存储器,其中也保存着和Flash完全相同的程序。5)进行第二次存储器映射
seealsoP136问题:第一、二次存储器映射的相同与不同?
执行完这段程序后,可以暂停BootLo796)初始化堆栈指针
在引导程序运行前,堆栈指针必须被初始化。堆栈指针的初始化涉及到CPSR_C和SP两个寄存器。通过对CPSR_C的赋值来实现处理器模式的转换;而对SP赋值来实现在不同模式下对堆栈指针的初始化。
;设置IRQ堆栈指针MOVr0,#0x12MSRcpsr_c,r0;MSR-通用寄存器到程序状态寄存器的数据传送指令;传送r0的内容到cpsr,但仅修改cpsr中的控制位域;切换到IRQ模式
MOVsp,=0x700000;为堆栈
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 淮安市辅警招聘考试题及答案
- 哈密市辅警招聘面试题及答案
- 2026 三年级上册 《选择合适的质量单位》 课件
- 2026年幼儿园钟表游戏
- 广安市辅警招聘考试题库及答案
- 交通运输企业办公设备资产管理自查自纠整改落实报告
- 2026年教师招聘面试试讲真题(初中生物)
- 教育培训托管服务场所消防安全告知承诺书
- 消防安全投标制度
- 2026年美国幼儿园的教育
- 当代中国经济教学知识考试复习题库(附答案)
- 2025-2026学年统编版道德与法治八年级下册期中模拟检测试题(含答案)
- 2025年人寿保险公司基本法
- 市县医院骨科、麻醉科加速康复实施管理专家共识解读课件
- 2021北京市中考数学真题及答案解析
- DB15∕T 3360-2024 饲草大麦裹包青贮技术规程
- 2026年外国人在中国永久居留资格申请服务合同
- 2025小学英语五年级阅读理解专项训练50篇
- 国家事业单位招聘2025中国康复研究中心招聘高层次人才拟聘用人员笔试历年参考题库附带答案详解
- 公墓单位防火安全培训内容课件
- 脊髓损伤的膀胱护理
评论
0/150
提交评论