




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第12章章 嵌入式应用程序示例嵌入式应用程序示例在本章中,介绍嵌入式应用程序的设计方法。首先介绍嵌入在本章中,介绍嵌入式应用程序的设计方法。首先介绍嵌入式应用程序设计的基本知识。然后通过几个示例,具体说明式应用程序设计的基本知识。然后通过几个示例,具体说明嵌入式应用程序的设计方法。对于每个示例,不仅详细介绍嵌入式应用程序的设计方法。对于每个示例,不仅详细介绍程序设计的要点,而且介绍如何使用程序设计的要点,而且介绍如何使用ARM开发工具编译和开发工具编译和连接这些程序,生成映像文件。本章是对前面几章知识的综连接这些程序,生成映像文件。本章是对前面几章知识的综合应用。合应用。12.2、12.3和
2、和12.4节中的示例是以节中的示例是以ARM公司的公司的PID为目标系为目标系统的。统的。12.5节中的示例是以节中的示例是以LinkUp公司的公司的L7210SDB评价评价板为目标系统的。由于各种嵌入式应用环境相差非常大,因板为目标系统的。由于各种嵌入式应用环境相差非常大,因此,这里主要是通过这些示例来更直接地介绍嵌入式应用系此,这里主要是通过这些示例来更直接地介绍嵌入式应用系统的开发方法,具体的代码会因嵌入式环境的不同而有差统的开发方法,具体的代码会因嵌入式环境的不同而有差异。异。212.1 嵌入式应用程序设计的基本知识嵌入式应用程序设计的基本知识本节介绍嵌入式应用程序设计的基本知识,比较
3、详本节介绍嵌入式应用程序设计的基本知识,比较详细地介绍系统初始化时要进行的操作。在后面几节细地介绍系统初始化时要进行的操作。在后面几节的例子中,还会详细介绍其中的一些技术。的例子中,还会详细介绍其中的一些技术。312.1.1 嵌入式应用系统中的存储映射嵌入式应用系统中的存储映射1. 地址地址0 x0处为处为ROM2. 地址地址0 x0处为处为RAM如果在系统正常运行过程中,地址0 x0处为RAM,则在系统复位时需要执行下面的操作序列。(1) 系统复位时,ROM被映射到地址0 x0处,程序从这里获取复位异常中断的中断向量。(2) 执行复位异常中断向量,这里使用的是高位中断向量表。假设系统中ROM
4、地址从0X0f000000开始,可以通过下面的伪指令跳转到存放在ROM中的下一条指令处执行:LDRPC,=0 x0f000004(3) 设置地址重映射寄存器REMAP=1,重新将RAM映射到地址0 x0开始的空间。(4) 完成其他的初始化代码。412.1.1 嵌入式应用系统中的存储映射嵌入式应用系统中的存储映射对地址空间进行重映射的存储器解码器可以通过下对地址空间进行重映射的存储器解码器可以通过下面的操作简单地实现:面的操作简单地实现: caseADDR(31:24)iswhen0 x00ifREMAP=0thenselectROMelseselectSRAMwhen0 x0FselectRO
5、Mwhen.512.1.2 系统初始化系统初始化1. 系统运行环境的初始化系统运行环境的初始化标识整个代码的初始入口点。设置异常中断向量表。初始化存储系统。初始化各模式下的数据栈。初始化一些关键的I/O接口。初始化异常中断需要使用的RAM变量。使能异常中断。如果需要的话,切换处理器模式。如果需要的话,切换处理器状态。2. 应用程序的初始化应用程序的初始化将已经初始化的数据搬运到可写的数据区。在可写存储区建立ZI属性的可写数据区。612.2 使用使用semihosting的的C语言程序示例语言程序示例semihosting技术将应用程序中的技术将应用程序中的I/O请求通过一定请求通过一定的通道传
6、送到主机的通道传送到主机(Host),由主机上的资源响应应,由主机上的资源响应应用程序的用程序的I/O请求,而不是像通常那样,由应用程请求,而不是像通常那样,由应用程序所在的计算机响应应用程序的序所在的计算机响应应用程序的I/O请求。请求。SWI指令可以根据指令中的参数,以及相关寄存器指令可以根据指令中的参数,以及相关寄存器的值选择执行某个特定的子程序。的值选择执行某个特定的子程序。ARM体系利用体系利用SWI提供提供semihosting功能。功能。本例是一个使用本例是一个使用semihosting的的C语言程序示例。语言程序示例。程序中包含了函数程序中包含了函数main()。这时,。这时,
7、C运行时库中的运行时库中的函数函数_main()将完成前面介绍的各种初始化操作,将完成前面介绍的各种初始化操作,应用程序中不需要进行这些初始化操作。应用程序中不需要进行这些初始化操作。712.2.1 源程序分析源程序分析在在main()函数中,调用了一些用户自己定义的子函数,包括函数中,调用了一些用户自己定义的子函数,包括demo_malloc()、demo_sscanf()、demo_printf()、demo_float_print()及及demo_sprintf()。这。这些子程序使用些子程序使用semihosting的的SWIs实现相应的功能。实现相应的功能。本应用程序可以运行在本例所
8、描述的本应用程序可以运行在本例所描述的semihosting环境中,也可以运行在嵌入环境中,也可以运行在嵌入式环境下。程序中的宏变量式环境下。程序中的宏变量EMBEDDED用来区分这两种运行环境。当定义了用来区分这两种运行环境。当定义了EMBEDDED时,程序运行于嵌入式环境,当未定义时,程序运行于嵌入式环境,当未定义EMBEDDED时,程序运行时,程序运行于于semihosting环境。环境。当程序运行于嵌入式环境时,该嵌入式系统的存储系统有两种映射方式。在第当程序运行于嵌入式环境时,该嵌入式系统的存储系统有两种映射方式。在第1种方式中,系统运行期间地址种方式中,系统运行期间地址0 x0处为
9、处为RAM,在系统复位时,在系统复位时,ROM被映射到地被映射到地址址0 x0处,程序的前几条指令将处,程序的前几条指令将RAM重新映射到地址重新映射到地址0 x0处。这种方式通过定义处。这种方式通过定义程序中的宏变量程序中的宏变量ROM_RAM_REMAP来标识。在第来标识。在第2种方式中,不进行地址重种方式中,不进行地址重映射,这是通过不定义程序中的宏变量映射,这是通过不定义程序中的宏变量ROM_RAM_REMAP来标识的。来标识的。就本例而言,程序中宏变量就本例而言,程序中宏变量EMBEDDED、ROM_RAM_REMAP以及以及USE_SERIAL_ PORT都没有被定义。程序实际上只
10、运行都没有被定义。程序实际上只运行main()中最后几个子中最后几个子程序调用。这几个子程序使用程序调用。这几个子程序使用semihosting SWIs提供的功能,在提供的功能,在Angel、Armulator和和MultiICE中都提供了中都提供了semihosting SWIs功能,用户不需要写其他功能,用户不需要写其他代码。代码。812.2.2 生成映像文件生成映像文件1. 编译编译C程序源文件程序源文件2. 连接源文件连接源文件3. 运行映像文件运行映像文件912.3 一个嵌入式应用系统示例一个嵌入式应用系统示例本例是在本例是在12.2中示例的基础上建立的。中示例的基础上建立的。12
11、.2中的示中的示例运行环境是例运行环境是semihosting,其中很多的系统初始,其中很多的系统初始化操作是由化操作是由C运行时库完成的,用户并不需要编写运行时库完成的,用户并不需要编写相应的代码。本例提供了系统初始化所需要的操作相应的代码。本例提供了系统初始化所需要的操作代码,它可以嵌入于目标系统中执行,不需要代码,它可以嵌入于目标系统中执行,不需要semihosting功能支持。功能支持。1012.3.1 源程序分析源程序分析1. main()函数的修改函数的修改2. 异常中断向量表以及异常中断处理程序异常中断向量表以及异常中断处理程序3. 重新实现低级重新实现低级I/O功能功能4. 串
12、行端口的驱动程序串行端口的驱动程序1112.3.2 生成映像文件生成映像文件1. 汇编汇编语言源程序汇编汇编语言源程序2. 编译编译C语言源程序语言源程序3. 连接源文件连接源文件4. 生成写入生成写入ROM的映像文件的映像文件5. 运行映像文件运行映像文件1212.3.3 本例中地址映射模式本例中地址映射模式本例中,地址本例中,地址0 x0开始的开始的ROM中包含了代码段中包含了代码段(RO段段);地址;地址0 x040000开始的开始的RAM中包含了数据段以中包含了数据段以及数据栈和数据堆;在及数据栈和数据堆;在init.s中将数据栈指针初始中将数据栈指针初始化成化成0 x80000;re
13、target.c中的中的_user_initial_stackheap将数据堆指针初始化成将数据堆指针初始化成0 x060000。在本例的应用程序中,使用了在本例的应用程序中,使用了main()函数,因此函数,因此_main()函数将会调用相应的函数将会调用相应的C运行时库中的相关运行时库中的相关功能,将功能,将RW数据从数据从ROM中复制到中复制到RAM中,并在中,并在RAM中建立中建立ZI数据段。如果在程序中没有使用数据段。如果在程序中没有使用main()函数,则应用程序需要自己进行相关的数据函数,则应用程序需要自己进行相关的数据复制和初始化工作。复制和初始化工作。1312.4 进行进行R
14、OM/RAM地址重映射的嵌入式应用系统地址重映射的嵌入式应用系统12.4.1 地址映射模式地址映射模式在一个嵌入式设备中,为了保持好的性能价格比,通常在系统中存在多种存储器。在本例中,系统中包含Flash、16位的RAM以及32位的RAM。在系统运行之前,所有程序和数据保存在Flash中。系统启动后,包含异常中断处理和数据栈的vectors.o模块被移动到32位的片内RAM中,在这里可以得到较快的运行速度;RW数据以及ZI数据被移动到16位片外RAM中;其他大多数的RO代码在Flash中运行,它们所在的域为固定域。作为嵌入式系统,在系统复位时,RAM中不包含任何程序和数据,这时所有的程序和数据
15、都保存在Flash中。在ARM系统中,通常在系统复位时把Flash映射到地址0 x0处,从而使得系统可以开始运行。在Flash中的前几条指令实现重新将RAM映射到地址0 x0处。1412.4.1地址映射模式本例中,地址映射模式如图本例中,地址映射模式如图12.2所示。所示。1512.4.2 源程序分析源程序分析本例的源代码和本例的源代码和12.3节中示例的源代码完全一样。在节中示例的源代码完全一样。在12.3节节的示例中,的示例中,ROM固定在地址固定在地址0 x0处,系统没有进行处,系统没有进行ROM/RAM地址重映射,这是通过不定义宏变量地址重映射,这是通过不定义宏变量ROM_RAM_RE
16、MAP来实现的。当不未定义宏变量来实现的。当不未定义宏变量ROM_RAM_REMAP时,源文件时,源文件init.s中的相关部分会被汇中的相关部分会被汇编器忽略,因而不进行编器忽略,因而不进行ROM/RAM地址重映射。地址重映射。在本例中定义了宏变量在本例中定义了宏变量ROM_RAM_REMAP,汇编器将会,汇编器将会把相关的代码包含到应用程序中,进行把相关的代码包含到应用程序中,进行ROM/RAM地址重映地址重映射。受宏变量射。受宏变量ROM_RAM_REMAP控制的那些代码在控制的那些代码在12.3节中没有介绍,这些代码如程序节中没有介绍,这些代码如程序12.6所示。所示。程序程序12.6 源文件源文件i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论