ARM体系结构与编程第2版ppt

上传人:cl****1 文档编号:578984757 上传时间:2024-08-25 格式:PPT 页数:341 大小:2.87MB
返回 下载 相关 举报
ARM体系结构与编程第2版ppt_第1页
第1页 / 共341页
ARM体系结构与编程第2版ppt_第2页
第2页 / 共341页
ARM体系结构与编程第2版ppt_第3页
第3页 / 共341页
ARM体系结构与编程第2版ppt_第4页
第4页 / 共341页
ARM体系结构与编程第2版ppt_第5页
第5页 / 共341页
点击查看更多>>
资源描述

《ARM体系结构与编程第2版ppt》由会员分享,可在线阅读,更多相关《ARM体系结构与编程第2版ppt(341页珍藏版)》请在金锄头文库上搜索。

1、第第2章章ARM指令分类及其寻址方式指令分类及其寻址方式在本章中,将介在本章中,将介绍ARM指令分指令分类以及各以及各类指令指令对应的的寻址方式。址方式。22.1ARM指令集概要介绍指令集概要介绍在本在本节中,将介中,将介绍ARM指令相关的一些基本概念,指令相关的一些基本概念,包括指令的分包括指令的分类、指令的一般、指令的一般编码格式以及格式以及ARM指令中的条件指令中的条件码。32.1.1ARM指令的分类指令的分类ARM指令集可以分指令集可以分为跳跳转指令、数据指令、数据处理指令、理指令、程序状程序状态寄存器寄存器(PSR)传输指令、指令、Load/Store指指令、令、协处理器指令和异常中

2、断理器指令和异常中断产生指令生指令6类。42.1.2ARM指令的一般编码格式指令的一般编码格式ARM指令字指令字长为固定的固定的32位。一条典型的位。一条典型的ARM指指令令编码格式如下:格式如下:312827252421201916151211870其中的符号及参数其中的符号及参数说明如下。明如下。opcode:指令操作符编码。cond:指令执行的条件编码。S:决定指令的操作是否影响CPSR的值。Rd:目标寄存器编码。Rn:包含第1个操作数的寄存器编码。shifter_operand:表示第2个操作数。5cond001opcodeSRnRdshifter_operand2.1.3ARM指令的

3、条件码域指令的条件码域条件条件码共有共有16个,各条件个,各条件码的含的含义和助和助记符如表符如表2.1所示。可条件所示。可条件执行的指令可以在其助行的指令可以在其助记符的符的扩展展域加上条件域加上条件码助助记符,从而在特定的条件下符,从而在特定的条件下执行。行。参见教材P2362.2ARM指令的寻址方式指令的寻址方式ARM指令的指令的寻址方式有以下几种,分址方式有以下几种,分别进行行讨论:数据处理指令的操作数的寻址方式。字及无符号字节的Load/Store指令的寻址方式。杂类Load/Store指令的寻址方式。批量Load/Store指令的寻址方式。协处理器Load/Store指令的寻址方式

4、。72.2.1数据处理指令的操作数的寻址方式数据处理指令的操作数的寻址方式通常数据通常数据处理指令的格式如下所示:理指令的格式如下所示:S,其中的符号及参数其中的符号及参数说明如下。明如下。:是指令助记符,如ADD表示算术加操作指令。:表示指令执行的条件。S:决定指令的操作是否影响CPSR的值。:表示目标寄存器。:表示包含第1个操作数的寄存器。:表示第2个操作数。82.2.1数据处理指令的操作数的寻址方式数据处理指令的操作数的寻址方式通常有下面通常有下面3种格式。种格式。(1)立即数方式。(2)寄存器方式。(3)寄存器移位方式。数据数据处理指令操作数的具体理指令操作数的具体寻址方式有下面址方式

5、有下面11种。种。#,LSL#,LSL,LSR#,LSR,ASR#,ASR,ROR#,ROR,RRX92.2.2字及无符号字节的字及无符号字节的Load/Store指令的寻址方式指令的寻址方式各种各种类型的型的Load/Store指令的指令的寻址方式由两部分址方式由两部分组成。一部分成。一部分为一个的基址寄存器;另一部分一个的基址寄存器;另一部分为一个一个地址偏移量。基址寄存器可以地址偏移量。基址寄存器可以为任一个通用寄存器;任一个通用寄存器;地址偏移量可以有以下地址偏移量可以有以下3种格式:种格式:立即数。寄存器。寄存器及一个移位常数。同同样,寻址方式的地址址方式的地址计算方法有如下算方法有

6、如下3种:种:偏移量方法。事先更新方法。事后更新方法。102.2.2字及无符号字节的字及无符号字节的Load/Store指令的寻址方式指令的寻址方式LDR指令的指令的语法格式如下所示:法格式如下所示:LDRBT,其中,其中,表示第表示第2个操作数的内存个操作数的内存地址,共有如下地址,共有如下9种格式:种格式:,#+/,+/,+/,#,#+/!,+/!,+/,#!,#+/,+/,+/,#112.2.3杂类杂类Load/Store指令的寻址方式指令的寻址方式这里所里所说的的杂类Load/Store指令,包括操作数指令,包括操作数为半字半字(无符无符号数或号数或带符号数符号数)数据的数据的Load

7、/Store指令;操作数指令;操作数为带符号符号的字的字节数据的数据的Load指令;双字的指令;双字的Load/Store指令。指令。这类指指令的令的语法格式法格式为:LDR|STRH|SH|SB|D,其中,其中,是指令中内存是指令中内存单元的元的寻址方式,址方式,具体有以下具体有以下6种格式:种格式:,#+/,+/,#+/!,+/!,#+/,+/122.2.4批量批量Load/Store指令的寻址方式指令的寻址方式一条批量一条批量Load/Store指令可以指令可以实现在一在一组寄存器和寄存器和一一块连续的内存的内存单元之元之间传输数据。其数据。其语法格式如法格式如下:下:DM|STM!,其

8、中,指令中寄存器和内存其中,指令中寄存器和内存单元的元的对应关系关系满足足这样的的规则,即,即编号低的寄存器号低的寄存器对应于内存中的低地于内存中的低地址址单元,元,编号高的寄存器号高的寄存器对应于内存中的高地址于内存中的高地址单元,元,中存放地址中存放地址块的最低地址的最低地址值。132.2.4批量批量Load/Store指令的寻址方式指令的寻址方式表示地址的表示地址的变化方式,有以化方式,有以下下4种方式。种方式。IA(IncrementAfter):事后递增方式。IB(IncrementBefore):事先递增方式。DA(DecrementAfter):事后递减方式。DB(Decreme

9、ntBefore):事先递减方式。批量批量Load/Store指令的指令的编码格式如下:格式如下:142.2.4批量批量Load/Store指令的寻址方式指令的寻址方式1.事后事后递增方式增方式IA2.事先事先递增方式增方式IB3.事后事后递减方式减方式DA4.事先事先递减方式减方式DB5.对应于于栈操作的操作的寻址方式址方式152.2.5协处理器协处理器Load/Store指令的寻址方式指令的寻址方式一条一条协处理器理器Load/Store指令可以在指令可以在ARM处理器和理器和协处理理器之器之间传输批量数据。其批量数据。其语法格式如下:法格式如下:L,其中,其中,表示地址的表示地址的变化方

10、式,有以下化方式,有以下4种格式:种格式:,#+/*4,#+/*4!,#+/*4,协处理器理器Load/Store指令的指令的编码格式如下所示。格式如下所示。162.2.5协处理器协处理器Load/Store指令的寻址方式指令的寻址方式1.偏移量偏移量,#+/*42.事先更新事先更新,#+/*4!3.事先更新事先更新,#+/*44.非索引非索引,17第第3章章ARM指令集介绍指令集介绍在本章中,将在本章中,将详细介介绍各各ARM指令,并指令,并给出一些典型的出一些典型的ARM功能代功能代码段。段。193.1ARM指令集指令集ARM指令集可以分指令集可以分为6类,即跳,即跳转指令、数据指令、数据

11、处理理指令、程序状指令、程序状态寄存器寄存器(PSR)传输指令、指令、Load/Store指令、指令、协处理器指令和异常中断理器指令和异常中断产生指生指令。令。为了更清楚地描述了更清楚地描述这些指令,将一些大些指令,将一些大类的指令的指令进一步分一步分为几个小几个小类分分别讲述。述。203.1.1跳转指令跳转指令在在ARM中,有两种方式可以中,有两种方式可以实现程序的跳程序的跳转:一种是跳:一种是跳转指令;另一种是直接向指令;另一种是直接向PC寄存器寄存器(R15)中写入目中写入目标地址地址值。在在ARM版本版本5以前的体系中,以前的体系中,传送到送到PC寄存器中的目寄存器中的目标地地址址值的

12、低两位的低两位bits1:0被忽略,跳被忽略,跳转指令只能在指令只能在ARM指令指令集中集中执行,即程序不能从行,即程序不能从ARM状状态切切换到到Thumb状状态。非非T系列版本系列版本5的的ARM体系不含体系不含Thumb指令,当程序指令,当程序试图切切换到到Thumb状状态时,将,将产生未定生未定义指令异常中断。指令异常中断。ARM的跳的跳转指令可以从当前指令向前或向后指令可以从当前指令向前或向后32MB的地址空的地址空间跳跳转。这类跳跳转指令有以下指令有以下4种。种。B:跳转指令。BL:带返回的跳转指令。BLX:带返回和状态切换的跳转指令。BX:带状态切换的跳转指令。213.1.1跳转

13、指令跳转指令1.B(跳跳转指令指令)及及BL(带返回的跳返回的跳转指令指令)2.BLX(1)3.BLX(2)4.BX指令指令223.1.2数据处理指令数据处理指令数据数据处理指令又可大致分理指令又可大致分为3类:数据:数据传送指令,送指令,如如MOV;算;算术逻辑运算指令,如运算指令,如ADD、SUB和和AND等;比等;比较指令,如指令,如TST。数据数据处理指令包括以下指令。理指令包括以下指令。MOV:数据传送指令。MVN:数据求反传送指令。CMP:比较指令。CMN:基于相反数的比较指令。TST:位测试指令。TEQ:相等测试指令。ADD:加法指令。SUB:减法指令。233.1.2数据处理指令

14、数据处理指令RSB:逆向减法指令。ADC:带位加法指令。SBC:带位减法指令。RSC:带位逆向减法指令。AND:逻辑与操作指令。BIC:位清除指令。EOR:逻辑异或操作指令。ORR:逻辑或操作指令。243.1.3乘法指令乘法指令ARM有两有两类乘法指令:一乘法指令:一类为32位的乘法指令,即位的乘法指令,即乘法操作的乘法操作的结果果为32位;另一位;另一类为64位的乘法指令,位的乘法指令,即乘法操作的即乘法操作的结果果为64位。两位。两类指令共有以下指令共有以下6条。条。MUL:32位乘法指令。MLA:32位带加数的乘法指令。SMULL:64位有符号数乘法指令。SMLAL:64位带加数的有符号

15、数乘法指令。UMULL:64位无符号数乘法指令。UMLAL:64位带加数的无符号数乘法指令。253.1.4杂类的算术指令杂类的算术指令在在ARMv5及以上的版本中,包含一条特及以上的版本中,包含一条特别的指令的指令CLZ,用,用于于计算操作数最高端算操作数最高端0的个数。的个数。这条指令主要用于以下两种条指令主要用于以下两种场合:合:计算操作数规范化(使其最高位为1)时需要左移的位数。确定一个优先级掩码中的最高优先级(最高位的优先级)。CLZ前前导0个数个数计数指令数指令CLZ指令用于指令用于计算寄存器中操作数最高端算寄存器中操作数最高端0的个数。如果操的个数。如果操作数的作数的bit31为1

16、,则指令返回指令返回0;如果操作数;如果操作数为0,则指令指令返回返回32。指令的指令的编码格式格式263.1.5状态寄存器访问指令状态寄存器访问指令ARM中有两条指令用于在状中有两条指令用于在状态寄存器和通用寄存器寄存器和通用寄存器之之间传送数据。送数据。关于状关于状态寄存器,寄存器,这里里仅强调以下几点。以下几点。(1)状态寄存器中,有些位是当前没有使用的,但在ARM将来的版本中有可能使用这些位,因此用户程序不要使用这些位。(2)程序不能通过直接修改CPSR中的T控制位直接将程序状态切换到Thumb状态,必须通过BX等指令完成程序状态的切换。(3)通常修改状态寄存器是通过“读取修改写回”的

17、操作序列来实现的。(4)状态寄存器访问指令包括以下两条。MRS:状态寄存器到通用寄存器的传送指令。MSR:通用寄存器到状态寄存器的传送指令。273.1.6Load/Store内存访问指令内存访问指令Load指令用于从内存中指令用于从内存中读取数据放入寄存器中;取数据放入寄存器中;Store指令用于将寄存器中的数据保存到内存。指令用于将寄存器中的数据保存到内存。ARM有两大有两大类的的Load/Store指令:一指令:一类用于操作用于操作32位的字位的字类型数据以及型数据以及8位无符号的字位无符号的字节类型数据;型数据;另一另一类用于操作用于操作16位半字位半字类型的数据以及型的数据以及8位的有

18、位的有符号字符号字节类型的数据。型的数据。Load/Store内存内存访问指令的一个操作数放在寄存指令的一个操作数放在寄存器中,另一个操作数的器中,另一个操作数的寻址方式参址方式参见2.2节。283.1.6Load/Store内存访问指令内存访问指令用于操作用于操作32位的字位的字类型数据以及型数据以及8位无符号的字位无符号的字节类型数据型数据的的Load/Store指令有以下指令。指令有以下指令。LDR:字数据读取指令。LDRB:字节数据读取指令。LDRBT:用户模式的字节数据读取指令。LDRH:半字数据读取指令。LDRSB:有符号的字节数据读取指令。LDRSH:有符号的半字数据读取指令。L

19、DRT:用户模式的字数据读取指令。STR:字数据写入指令。STRB:字节数据写入指令。STRBT:用户模式字节数据写入指令。STRH:半字数据写入指令。STRT:用户模式字数据写入指令。293.1.7批量批量Load/Store内存访问指令内存访问指令批量批量Load内存内存访问指令可以一次从指令可以一次从连续的内存的内存单元中元中读取数据,取数据,传送到指令中的内存列表中的各个送到指令中的内存列表中的各个寄存器中。寄存器中。批量批量Store内存内存访问指令可以将指令中寄存器列表指令可以将指令中寄存器列表中的各个寄存器中的各个寄存器值写入到内存中,内存的地址由指写入到内存中,内存的地址由指令

20、中的令中的寻址模式确定。址模式确定。批量批量Load/Store内存内存访问指令的指令的语法格式如下:法格式如下:LDM|STMRn!,其中,操作数的其中,操作数的寻址方式参址方式参见2.2节。303.1.7批量批量Load/Store内存访问指令内存访问指令批量批量Load/Store内存内存访问指令主要有以下几条。指令主要有以下几条。LDM(1):批量内存字数据读取指令。LDM(2):用户模式的批量内存字数据读取指令。LDM(3):带状态寄存器的批量内存字数据读取指令。STM(1):批量内存字数据写入指令。STM(2):用户模式的批量内存字数据写入指令。313.1.8信号量操作指令信号量操

21、作指令信号量用于信号量用于进程程间的同步和互斥。的同步和互斥。对信号量的操作信号量的操作通常要求是一个原子操作,即在一条指令中完成信通常要求是一个原子操作,即在一条指令中完成信号量的号量的读取和修改操作。取和修改操作。ARM提供了如下两条指令提供了如下两条指令来完成信号量的操作。来完成信号量的操作。SWP:交换指令。SWPB:字节交换指令。323.1.9异常中断产生指令异常中断产生指令ARM有两条异常中断有两条异常中断产生指令。生指令。SWI:软中断指令。SWI用于产生SWI异常中断,ARM正是通过这种机制实现在用户模式中对操作系统中特权模式的程序的调用。BKPT:断点中断指令。BKPT在AR

22、Mv5及以上的版本中引入,主要用于产生软件断点,供调试程序使用。333.1.10ARM协处理器指令协处理器指令ARM支持支持16个个协处理器。理器。ARM协处理器可以部分地理器可以部分地执行一条指令,然后行一条指令,然后产生异常中生异常中断,如像除法运算除数断,如像除法运算除数为0的情况。所有的情况。所有这些操作均由些操作均由ARM协处理器决定,理器决定,ARM处理器并不参与理器并不参与这些操作。同些操作。同样,ARM协处理器指令中的理器指令中的协处理器的寄存器理器的寄存器标识符以及操作符以及操作类型助型助记符也有各种不同的符也有各种不同的实现定定义,程序,程序员可以通可以通过宏来宏来定定义这

23、些指令的些指令的语法格式。法格式。ARM协处理器指令包括以下理器指令包括以下3类:用于ARM处理器初始化ARM协处理器的数据处理操作。用于ARM处理器的寄存器和ARM协处理器的寄存器间的数据传送操作。用于在ARM协处理器的寄存器和内存单元之间传送数据。343.1.10ARM协处理器指令协处理器指令这些指令包括以下些指令包括以下5条。条。CDP:协处理器数据操作指令。LDC:协处理器数据读取指令。STC:协处理器数据写入指令。MCR:ARM寄存器到协处理器寄存器的数据传送指令。MRC:协处理器寄存器到ARM寄存器的数据传送指令。353.2一些基本的一些基本的ARM指令功能段指令功能段本本节介介绍

24、一些基本的一些基本的ARM指令代指令代码段。通段。通过对这些些代代码段的分析,段的分析,进一步理解相关的一步理解相关的ARM指令的用法,指令的用法,逐步学逐步学习如何使用如何使用ARM指令指令编写高效率的程序。本写高效率的程序。本节主要包括以下几部分的内容:主要包括以下几部分的内容:算术逻辑运算指令的应用。跳转指令的应用。Load/Store指令的应用。批量Load/Store指令的应用。信号量指令的应用。与系统相关的一些指令的应用。363.2.1算术逻辑运算指令的应用算术逻辑运算指令的应用1.位操作指令位操作指令应用用举例例2.实现乘法的指令段乘法的指令段举例例3.64位数据运算位数据运算举

25、例例4.转换内存中数据存内存中数据存储方式的指令段方式的指令段一种是字数据中的高位数据存放在高地址处,低位数据存放在低地址处另一种是字中高位数据存放在低地址处,低位数据存放在高地址处373.2.2跳转指令的应用跳转指令的应用1.子程序子程序调用用2.条件条件执行行3.条件判断条件判断语句句4.循循环语句句5.多路分支程序多路分支程序语句句383.2.3Load/Store指令的应用指令的应用1.链表操作表操作2.简单的串比的串比较3.长跳跳转4.多路跳多路跳转393.2.4批量批量Load/Store指令的应用指令的应用1.简单的的块复制复制2.子程序子程序进入和退出入和退出时数据的保存和恢复

26、数据的保存和恢复403.2.5信号量指令的应用信号量指令的应用信号量用于信号量用于实现对临界区数据界区数据访问的同步。下面的的同步。下面的代代码说明了在明了在ARM中如何中如何实现这一一过程。代程。代码中用中用进程程标识符来表示各信号量的所有者,代符来表示各信号量的所有者,代码执行前行前进程的程的标识符保存在符保存在R1中,信号量的地址保存在中,信号量的地址保存在R0中。当信号量中。当信号量值为0时,表示与,表示与该信号量相关的信号量相关的临界区可用;当信号量界区可用;当信号量值为1时,表示当前有,表示当前有进程程正在正在查看看该信号量的信号量的值。如果当前。如果当前进程程查看的信号看的信号量

27、正忙,当前量正忙,当前进程将一直等待程将一直等待该信号量。信号量。为了避免了避免当前当前进程的程的查询操作阻塞操作系操作阻塞操作系统的的进程程调度,可度,可以在下一次以在下一次查询之前完成操作系之前完成操作系统中的系中的系统调用,用,使当前使当前进程休眠一段程休眠一段时间。参见教材P116413.2.6与系统相关的一些指令代码段与系统相关的一些指令代码段1.SWI中断中断处理程序示例理程序示例2.IRQ中断中断处理程序示例理程序示例3.进程切程切换423.3Thumb指令介绍指令介绍在在ARM体系体系结构中,构中,ARM指令集中的指令是指令集中的指令是32位指令,其位指令,其执行效率很高。行效

28、率很高。对于存于存储系系统数据数据总线为16位的位的应用系用系统,ARM体系提供了体系提供了Thumb指令集。指令集。Thumb指令集是指令集是对ARM指令集的一个子集指令集的一个子集进行重新行重新编码而得到的,其指令而得到的,其指令长度度为16位。在位。在ARM体系的体系的T变种种(TVariant)的版本中,同的版本中,同时支持支持ARM指令集和指令集和Thumb指令集,而且遵守一定的指令集,而且遵守一定的调用用规则时,Thumb子程序和子程序和ARM子程序可以相互子程序可以相互调用。用。通常在通常在处理器理器执行行ARM程序程序时,称,称处理器理器处于于ARM状状态;在在处理器理器执行行

29、Thumb程序程序时,称,称处理器理器处于于Thumb状状态。注意注意处理器状理器状态和和处理器模式指的是不同的概念。理器模式指的是不同的概念。Thumb指令集并没有改指令集并没有改变ARM体系底体系底层的程序的程序设计模型,模型,只是在只是在该模型上增加了一些限制条件。模型上增加了一些限制条件。Thumb指令集中的指令集中的数据数据处理指令的操作数仍然是理指令的操作数仍然是32位的,指令位的,指令寻址地址也是址地址也是32位的。位的。433.3Thumb指令介绍指令介绍处理器理器执行行Thumb指令指令时,可以使用的整数寄存器,可以使用的整数寄存器通常通常为R0R7,有些指令,有些指令还使用

30、到了程序使用到了程序计数器数器寄存器寄存器PC(R15)、程序返回寄存器、程序返回寄存器LR(R14)以及以及栈指指针寄存器寄存器SP(R13)。在。在Thumb状状态下,下,读取取R15寄存器寄存器时,位,位0值为0,位,位31:1包含了程序包含了程序计数数器的器的值;在向;在向R15寄存器写入数据寄存器写入数据时时,位,位0被忽被忽略,位略,位31:1被被设置成当前程序置成当前程序计数器的数器的值。Thumb指令集没有提供指令集没有提供访问CPSR/SPSR寄存器的寄存器的指令。指令。处理器根据理器根据CPSR寄存器中的寄存器中的T位来确定指令位来确定指令类型:型:当T位为0时,指令为AR

31、M指令。当T位为1时,指令为Thumb指令。44第第4章章ARM汇编语言程序设计汇编语言程序设计本章介本章介绍如何如何编写写ARM和和Thumb汇编语言程序,言程序,同同时介介绍ARM汇编编译器器armasm的使用方法。的使用方法。464.1伪伪操操作作伪操作不像机器指令那操作不像机器指令那样在在计算机运行期算机运行期间由机器由机器执行,它行,它是在是在汇编程序程序对源程序源程序汇编期期间由由汇编程序程序处理的。宏是一理的。宏是一段独立的程序代段独立的程序代码。在程序中通。在程序中通过宏指令宏指令调用用该宏。当程序宏。当程序被被汇编时,汇编程序将程序将对每个宏每个宏调用用进行展开,用宏定行展开

32、,用宏定义体体取代源程序中的宏指令。本取代源程序中的宏指令。本节介介绍以下以下类型的型的ARM伪操作操作和宏指令:和宏指令:符号定义(SymbolDefinition)伪操作。数据定义(DataDefinition)伪操作。汇编控制(AssemblyControl)伪操作。数据帧描述(FrameDescription)伪操作。信息报告(Reporting)伪操作。其他(Miscellaneous)伪操作。474.1.1符号定义伪操作符号定义伪操作符号定符号定义(SymbolDefinition)伪操作用于定操作用于定义ARM汇编程序中的程序中的变量,量,对变量量进行行赋值以及定以及定义寄存器名

33、称。包括以下寄存器名称。包括以下伪操作。操作。GBLA、GBLL及GBLS:声明全局变量。LCLA、LCLL及LCLS:声明局部变量。SETA、SETL及SETS:给变量赋值。RLIST:为通用寄存器列表定义名称。CN:为协处理器的寄存器定义名称。CP:为协处理器定义名称。DN及SN:为VFP的寄存器定义名称。FN:为FPA的浮点寄存器定义名称。484.1.2数据定义伪操作数据定义伪操作数据定数据定义(DataDefinition)伪操作包括以下具体的操作包括以下具体的伪操作。操作。LTORG:声明一个数据缓冲池(LiteralPool)的开始。MAP:定义一个结构化的内存表(StorageM

34、ap)的首地址。FIELD:定义结构化的内存表中的一个数据域(Field)。SPACE:分配一块内存单元,并用0初始化。DCB:分配一段字节的内存单元,并用指定的数据初始化。DCD及DCDU:分配一段字的内存单元,并用指定的数据初始化。DCDO:分配一段字的内存单元,并将各单元的内容初始化成该单元相对于静态基值寄存器的偏移量。494.1.2数据定义伪操作数据定义伪操作DCFD及DCFDU:分配一段双字的内存单元,并用双精度的浮点数据初始化。DCFS及DCFSU:分配一段字的内存单元,并用单精度的浮点数据初始化。DCI:分配一段字节的内存单元,用指定的数据初始化,指定内存单元中存放的是代码,而不

35、是数据。DCQ及DCQU:分配一段双字的内存单元,并用64位的整数数据初始化。DCW及DCWU:分配一段半字的内存单元,并用指定的数据初始化。DATA:在代码段中使用数据。现已不再使用,仅用于保持向前兼容。504.1.3汇编控制伪操作汇编控制伪操作汇编控制控制(AssemblyControl)伪操作包括下面操作包括下面的的伪操作:操作:IF、ELSE及ENDIFWHILE及WENDMACRO及MENDMEXIT514.1.4数据帧描述伪操作数据帧描述伪操作栈中数据中数据帧描述描述伪操作主要用于操作主要用于调试,这里不里不介介绍这部分内容。感部分内容。感兴趣的趣的读者可以参考者可以参考ARM的相

36、关的相关资料。料。524.1.5信息报告伪操作信息报告伪操作信息信息报告告(Reporting)伪操作包括下列具体的操作包括下列具体的伪操作:操作:ASSERTINFOOPTTTL及SUBT534.1.6其他的伪操作其他的伪操作这些些杂类的的伪操作包括:操作包括:CODE16及CODE32EQUAREAENTRYENDALIGNEXPORT或GLOBALIMPORTEXTERNGET或INCLUDE544.1.6其他的伪操作其他的伪操作INCBINKEEPNOFPREQUIREREQUIRE8及PRESERVE8RNROUT554.2ARM汇编语言伪指令汇编语言伪指令ARM中中伪指令不是真正的

37、指令不是真正的ARM指令或者指令或者Thumb指指令,令,这些些伪指令在指令在汇编编译器器对源程序源程序进行行汇编处理理时被替被替换成成对应的的ARM或者或者Thumb指令指令(序列序列)。ARM伪指令包括指令包括ADR、ADRL、LDR和和NOP。1.ADR(小范围的地址读取伪指令)2.ADRL(中等范围的地址读取伪指令)3.LDR大范围的地址读取伪指令4.NOP空操作伪指令564.3ARM汇编语言语句的格式汇编语言语句的格式ARM汇编语言言语句格式如下:句格式如下:symbolinstruction|directive|pseudoinstruction;comment其中的符号及参数其中

38、的符号及参数说明如下:明如下:instruction为指令。在ARM汇编语言中,指令不能从一行的行头开始。在一行语句中,指令的前面必须有空格或者符号。directive为伪操作。pseudoinstruction为伪指令。symbol为符号。在ARM汇编语言中,符号必须从一行的行头开始,并且符号中不能包含空格。在指令和伪指令中,符号用作地址标号(label);在有些伪操作中,符号用作变量或者常量。comment为语句的注释。在ARM汇编语言中,注释以分号(;)开头。注释的结尾即为一行的结尾。注释也可以单独占用一行。574.3.1ARM汇编语言中的符号汇编语言中的符号在在ARM汇编语言中,符号言

39、中,符号(Symbols)可以代表地址可以代表地址(Addresses)、变量量(Variables)和数字常量和数字常量(NumericConstants)。当符号代表地址。当符号代表地址时,又,又称称为标号号(Label)。当。当标号以数字开号以数字开头时,其作用范,其作用范围为当前段当前段(没有使没有使用用ROUT伪操作操作时),这种种标号又称号又称为局部局部标号号(LocalLabel)。符号包括。符号包括变量、数字常量、量、数字常量、标号和局部号和局部标号。号。符号的命名符号的命名规则如下:如下:符号由大小写字母、数字以及下划线组成。局部标号以数字开头,其他的符号都不能以数字开头。符

40、号是区分大小写的。符号中的所有字符都是有意义的。符号在其作用范围内必须惟一,即在其作用范围内不可有同名的符号。程序中的符号不能与系统内部变量或者系统预定义的符号同名。程序中的符号通常不要与指令助记符或者伪操作同名。当程序中的符号与指令助记符或者伪操作同名时,可用双竖线将符号括起来,如|require|,这时双竖线并不是符号的组成部分。584.3.1ARM汇编语言中的符号汇编语言中的符号1.变量量2.数字常量数字常量3.汇编时的的变量替量替换4.标号号5.局部局部标号号594.3.2ARM汇编语言中的表达式汇编语言中的表达式表达式是由符号、数表达式是由符号、数值、单目或多目操作符以及括目或多目操

41、作符以及括号号组成的。在一个表达式中,各种元素的成的。在一个表达式中,各种元素的优先先级如如下所示:下所示:括号内的表达式优先级最高。各种操作符有一定的优先级。相邻的单目操作符的执行顺序为由右到左,单目操作符优先级高于其他操作符。优先级相同的双目操作符执行顺序为由左到右。604.3.2ARM汇编语言中的表达式汇编语言中的表达式1.字符串表达式字符串表达式(1)字符串(2)字符串变量(3)操作符LENCHRSTRLEFTRIGHTCC(4)字符变量的声明和赋值(5)字符串表达式应用举例614.3.2ARM汇编语言中的表达式汇编语言中的表达式2.数字表达式数字表达式(1)整数数字量(2)浮点数字量

42、(3)数字变量(4)操作符NOT按位取反+、/及MOD算术操作符ROL、ROR、SHL及SHR移位(循环移位操作)AND、OR及EOR按位逻辑操作符624.3.2ARM汇编语言中的表达式汇编语言中的表达式3.基于寄存器和基于基于寄存器和基于PC的表达式的表达式(1)BASE(2)INDEX(3)+、4.逻辑表达式表达式(1)关系操作符(2)逻辑操作符5.其他的一些操作符其他的一些操作符(1)?(2)DEF(3)SB_OFFSET_19_12(4)SB_OFFSET_11_0634.4ARM汇编语言程序的格式汇编语言程序的格式本小本小节介介绍ARM汇编语言程序的基本格式以及言程序的基本格式以及子

43、程序子程序间调用的格式。用的格式。644.4.1汇编语言程序的格式汇编语言程序的格式ARM汇编语言以段言以段(Section)为单位位组织源文件。段是相源文件。段是相对独立的、具有特定名称的、不可分割的指令或者数据序列。独立的、具有特定名称的、不可分割的指令或者数据序列。段又可以分段又可以分为代代码段和数据段,代段和数据段,代码段存放段存放执行代行代码,数据,数据段存放代段存放代码运行运行时需要用到的数据。一个需要用到的数据。一个ARM源程序至少源程序至少需要一个代需要一个代码段,大的程序可以包含多个代段,大的程序可以包含多个代码段和数据段。段和数据段。ARM汇编语言源程序言源程序经过汇编处理

44、后,生成一个可理后,生成一个可执行的行的映像文件映像文件(类似于似于Windows系系统下的下的EXE文件文件)。该可可执行的行的映像文件通常包括下面映像文件通常包括下面3部分:部分:一个或多个代码段。代码段通常是只读的。零个或多个包含初始值的数据段。这些数据段通常是可读写的。零个或多个不包含初始值的数据段。这些数据段被初始化为0,它们通常是可读写的。654.4.2汇编语言子程序的调用汇编语言子程序的调用在在ARM汇编语言中,子程序言中,子程序调用是通用是通过BL指令完指令完成的。成的。BL指令的指令的语法格式如下:法格式如下:BLsubname其中,其中,subname是是调用的子程序的名称

45、。用的子程序的名称。BL指令完成两个操作:将子程序的返回地址放在指令完成两个操作:将子程序的返回地址放在LR寄存器中,同寄存器中,同时将将PC寄存器寄存器值设置成目置成目标子程子程序的第一条指令地址。序的第一条指令地址。在子程序返回在子程序返回时,可以通,可以通过将将LR寄存器的寄存器的值传送到送到PC寄存器中来寄存器中来实现。子程序子程序调用用时,通常使用寄存器,通常使用寄存器R0R3来来传递参参数和返回数和返回结果,果,这些在后面的些在后面的编程模型中程模型中还会有会有详细的介的介绍。664.5ARM汇编编译器的使用汇编编译器的使用内嵌的内嵌的ARM汇编编译器是器是ARM中中C/C+编译器

46、的一部分,器的一部分,它没有自己的命令行格式。在它没有自己的命令行格式。在ARMASM命令中,除了文件命令中,除了文件名区分大小写之外,其他的参数都不区分大小写。名区分大小写之外,其他的参数都不区分大小写。ARMASM的的语法格式如下所示:法格式如下所示:armasm16|32apcsnone|/qualifier/qualifier.bigend|littleendcheckreglistcpucpudependdependfile|m|mderrorserrorfilefpunameghelpidir,dirkeeplistlistingfileoptionsmaxcachenmemacc

47、essattributesnocachenoescnoregsnowarnofilenamepredefinedirectivesplit_ldmunsafeviafileinputfile674.6汇编程序设计举例汇编程序设计举例在本在本节中,将通中,将通过一些例子来一些例子来说明明ARM中中伪操操作以及指令的用法。作以及指令的用法。4.6.1小小节中中给出了一些出了一些伪操作的操作的实例,例,4.6.2小小节中是一些中是一些ARM汇编程序程序的的实例。例。684.6.1ARM中伪操作的使用实例中伪操作的使用实例程序程序4.1ARM中中伪操作的使用操作的使用实例:例:参见教材P166694.

48、6.2ARM汇编程序的实例汇编程序的实例1.数据数据块复制复制2.ADR伪操作的使用操作的使用实例例3.利用跳利用跳转表表实现程序跳程序跳转4.伪指令指令LDR的使用的使用实例例70第第5章章ARM的存储系统的存储系统与其他的中、低档与其他的中、低档单片机不同,片机不同,ARM处理器中理器中可以包含一个存可以包含一个存储管理部件。本章介管理部件。本章介绍ARM体体系中两种典型的存系中两种典型的存储管理管理实现机制。并在最后机制。并在最后给出一个出一个实例。例。725.1ARM存储系统概述存储系统概述ARM存存储系系统的体系的体系结构可以适构可以适应多种不同的嵌入式多种不同的嵌入式应用用系系统。

49、最。最简单的存的存储系系统使用普通的地址映射机制,就像在使用普通的地址映射机制,就像在一些一些简单的的单片机系片机系统中一中一样,地址空,地址空间的分配方式是固定的分配方式是固定的,系的,系统中各部分都使用物理地址。而一些复中各部分都使用物理地址。而一些复杂的系的系统可能可能包括一种或者多种下面的技包括一种或者多种下面的技术,从而可以提供功能更,从而可以提供功能更为强大大的存的存储系系统:系统中可能包含多种类型的存储器件通过使用Cache及WriteBuffer技术,可以缩小处理器和存储系统的速度差别,从而提高系统的整体性能。内存管理部件使用内存映射技术实现虚拟空间到物理空间的映射引入存储保护

50、机制,增强系统的安全性。引入一些机制,保证将I/O操作映射成内存操作后,各种I/O操作能够得到正确的结果。735.1ARM存储系统概述存储系统概述本章中主要介本章中主要介绍以下内容。在介以下内容。在介绍相关内容相关内容时,将,将以以LinkUp公司的通用公司的通用ARM芯片芯片L7205作作为例子。例子。ARM中用于存储管理的系统控制协处理器CP15。ARM中的存储管理部件MMU(MemoryManagementUnit)。ARM中的Cache及WriteBuffer技术。快速进程上下文切换技术。745.2ARM中用于存储管理的系统控制协处理器中用于存储管理的系统控制协处理器CP15CP15可

51、以包含可以包含16个个32位的寄存器,其位的寄存器,其编号号为015。实际上,上,对于某些于某些编号的寄存器,可能号的寄存器,可能对应有多个物理寄存器,有多个物理寄存器,在指令中可指定特定的在指令中可指定特定的标志位来区分志位来区分这些物理寄存器。些物理寄存器。这种种机制有些机制有些类似于似于ARM中的寄存器,当中的寄存器,当处于不同的于不同的处理器模理器模式式时,某些,某些ARM寄存器可能是不同的物理寄存器,比如寄存器可能是不同的物理寄存器,比如对于寄存器于寄存器SPSR,每一种,每一种处理器模式下都理器模式下都对应一个独立的物一个独立的物理寄存器理寄存器(用用户模式和系模式和系统模式模式对

52、应同同样的物理寄存器,的物理寄存器,这是一个例外是一个例外)。CP15中的寄存器可能是只中的寄存器可能是只读的,也可能是只写的,的,也可能是只写的,还有一有一些是可以些是可以读写的。写的。对于每一种寄存器,将会于每一种寄存器,将会详细介介绍:寄存器的访问类型(只读/只写/读写)。各种访问操作对于寄存器的作用。寄存器是否对应有多个物理寄存器。寄存器的具体作用。755.2.1访问访问CP15寄存器的指令寄存器的指令访问CP15寄存器的指令有下面两种。寄存器的指令有下面两种。MCR:ARM寄存器到协处理器寄存器的数据传送指令。MRC:协处理器寄存器到ARM寄存器的数据传送指令。MCR指令和指令和MR

53、C指令只能在指令只能在处理器模式是系理器模式是系统模模式式时执行,在用行,在用户模式下模式下执行行MCR指令和指令和MRC指指令将会触令将会触发未定未定义指令的异常中断。指令的异常中断。765.2.2CP15中的寄存器中的寄存器1.CP15中的寄存器中的寄存器C0(1)标识符寄存器ARM7之后的处理器ARM7处理器ARM7之前的处理器(2)Cache类型标识符寄存器2.CP15中的寄存器中的寄存器C1CP15中的寄存器C1是一个控制寄存器,它包括以下控制功能:禁止/使能MMU以及其他的与存储系统相关的功能。配置存储系统以及ARM处理器中的相关部分的工作方式。775.3存储器管理单元存储器管理单

54、元MMU5.3.1存存储器管理器管理单元元MMU概述概述在ARM系统中,存储器管理单元MMU主要完成以下工作:虚拟存储空间到物理存储空间的映射。在ARM中采用了页式虚拟存储管理。它把虚拟地址空间分成一个个固定大小的块,每一块称为一页,把物理内存的地址空间也分成同样大小的页。页的大小可以分为粗粒度和细粒度两种。MMU就要实现从虚拟地址到物理地址的转换。存储器访问权限的控制。设置虚拟存储空间的缓冲的特性。785.3.1存储器管理单元MMU概述页表表(TranslateTable)是是实现上述上述这些功能的重要些功能的重要手段,它是一个位于内存中的表。手段,它是一个位于内存中的表。页表存放在内存中,

55、系表存放在内存中,系统通常用一个寄存器来保存通常用一个寄存器来保存页表的基地址。在表的基地址。在ARM中,系中,系统控制控制协处理器理器CP15的寄存器的寄存器C2用来保存用来保存页表的基地址。表的基地址。当当CPU需要需要访问内存内存时,先在,先在TLB中中查找需要的地找需要的地址址变换条目。如果条目。如果该条目不存在,条目不存在,CPU从位于内存从位于内存中的中的页表中表中查询,并把相,并把相应的的结果添加到果添加到TLB中。中。这样,当,当CPU下一次又需要下一次又需要该地址地址变换条目条目时,就,就可以从可以从TLB中直接得到了,从而使地址中直接得到了,从而使地址变换的速度的速度大大加

56、快。大大加快。795.3.1存储器管理单元MMU概述当内存中的当内存中的页表内容改表内容改变,或者通,或者通过修改系修改系统控制控制协处理器理器CP15的寄的寄存器存器C2使用新的使用新的页表表时,TLB中的内容需要全部清除。中的内容需要全部清除。MMU提供了相提供了相关的硬件支持关的硬件支持这种操作。系种操作。系统控制控制协处理器理器CP15的寄存器的寄存器C8用来控制用来控制清除清除TLB内容的相关操作。内容的相关操作。MMU可以将某些地址可以将某些地址变换条目条目锁定定(LockedDown)在在TLB中,从而使中,从而使得得进行与行与该地址地址变换条目相关的地址条目相关的地址变换速度保

57、持很快。在速度保持很快。在MMU中,寄中,寄存器存器C10用于控制用于控制TBL内容的内容的锁定。定。MMU可以将整个存可以将整个存储空空间分分为最多最多16个域个域(Domain)。每个域。每个域对应一定一定的内存区域,的内存区域,该区域具有相同的区域具有相同的访问控制属性。控制属性。MMU中,寄存器中,寄存器C3用用于控制与域相关的属性的配置。于控制与域相关的属性的配置。当存当存储访问失效失效时,MMU提供了相提供了相应的机制用于的机制用于处理理这种情况。在种情况。在MMU中,寄存器中,寄存器C5和寄存器和寄存器C6用于支持用于支持这些机制。些机制。805.3.2禁止禁止/使能使能MMUC

58、P15的寄存器的寄存器C1的位的位0用于控制禁止用于控制禁止/使能使能MMU。当。当CP15的寄存器的寄存器C1的位的位0设置成置成0时,禁止,禁止MMU;当;当CP15的寄存器的寄存器C1的位的位0设置成置成1时,使,使能能MMU。下面的指令使能。下面的指令使能MMU:MRCP15,0,R0,C1,0,0ORRR0,#01MCRP15,0,R0,C1,0,01.使能使能MMU时存存储访问过程程2.禁止禁止MMU时存存储访问过程程3.禁止禁止/使能使能MMU时应注意的注意的问题815.3.3MMU中的地址变换过程中的地址变换过程ARM支持的存支持的存储块大小有以下几种。大小有以下几种。段(se

59、ction):是大小为1MB的存储块。大页(LargePages):是大小为64KB的存储块。小页(SmallPages):是大小为4KB的存储块。极小页(TinyPages):是大小为1KB的存储块。在在MMU中采用下面两中采用下面两级页表表实现上述地址映射:上述地址映射:一级页表中包含有以段为单位的地址变换条目以及指向二级页表的指针。一级页表实现的地址映射粒度较大。二级页表中包含以大页和小页为单位的地址变换条目。其中,一种类型的二级页表还包含有以极小页为单位的地址变换条目。825.3.3MMU中的地址变换过程中的地址变换过程1.基于一基于一级页表的地址表的地址变换过程程(1)基于一级页表的

60、地址变换过程(2)段描述符及其地址变换过程(3)粗粒度页表描述符(4)细粒度页表描述符835.3.3MMU中的地址变换过程中的地址变换过程2.基于二基于二级页表的地址表的地址变换过程程二级页表有两种:粗粒度的二级页表和细粒度的二级页表。(1) 大页描述符以及相关的地址变换(2) 小页描述符以及相关的地址变换(3) 极小页描述符以及相关的地址变换845.3.4MMU中的存储访问权限控制中的存储访问权限控制在在MMU中,寄存器中,寄存器C1的的R、S控制位和控制位和页表中地址表中地址转换条目中的条目中的访问权限控制位限控制位联合作用,控制存合作用,控制存储访问的的权限。具体限。具体规则如表如表5.

61、20所示。所示。85APSR特权级的访问权限用户级的访问权限0b0000没有访问权限没有访问权限0b0010只读没有访问权限0b0001只读只读0b0011不可预知不可预知0b01XX读/写没有访问权限0b10XX读/写只读0b11XX读/写读/写5.3.5MMU中的域中的域MMU中的域指的是一些段、大中的域指的是一些段、大页或者小或者小页的集合。的集合。ARM支持最多支持最多16个域,每个域的个域,每个域的访问控制特性由控制特性由CP15中的寄存器中的寄存器C3中的两位来控制。中的两位来控制。这样就能很就能很方便地将某个域的地址空方便地将某个域的地址空间包含在虚包含在虚拟存存储空空间中,中,

62、或者排除在虚或者排除在虚拟存存储空空间之外。之外。CP15中的寄存器中的寄存器C3的格式如下所示。的格式如下所示。86D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D05.3.6关于快表的操作关于快表的操作1.使无效使无效(Invalidate)快表的内容快表的内容2.锁定快表的内容定快表的内容(1)寄存器C10(2)锁定TLB875.3.7ARM中的存储访问失效中的存储访问失效在在ARM中有下面两种机制可以中有下面两种机制可以检测存存储访问失效,失效,并并进而中止而中止CPU的的执行:行:当MMU检测到存储访问失效时,它可以向CPU报告该情况,并将存储访问失效的相关

63、信息保存到寄存器中。这种机制称为MMU失效(MMUFault)。外部存储系统也可以向CPU报告存储访问失效。这种机制称为外部存储访问中止(ExternalAbort)。上述两种情况上述两种情况统称称为存存储访问中止中止(Abort)。这时称称造成存造成存储访问中止的存中止的存储访问被中止被中止(Aborted)。如果存如果存储访问中止中止发生在数据生在数据访问周期,周期,CPU将将产生数据生数据访问中止异常中断。如果存中止异常中断。如果存储访问中止中止发生生在指令在指令预取周期,当取周期,当该指令指令执行行时,CPU产生指令生指令预取异常中断。取异常中断。885.3.7ARM中的存储访问失效中

64、的存储访问失效1.MMU失效失效(1)MMU中与存储访问失效相关的寄存器(2)MMU存储访问失效的类型2.外部存外部存储访问失效失效读操作。非缓冲的写操作。一级描述符的获取。二级描述符的获取。非缓冲的存储区域中的信号量操作。895.4高速缓冲存储器和写缓冲区高速缓冲存储器和写缓冲区通常通常ARM处理器的主理器的主频为几十几十MHz,有的已,有的已经达到达到200MHz。而一般的主存。而一般的主存储器使用器使用动态存存储器器(DRAM),其存,其存储周期周期仅为100ns200ns。这样,如果指令和数据都存放在主存如果指令和数据都存放在主存储器中,主存器中,主存储器的器的速度将会速度将会严重制重

65、制约整个系整个系统的性能。的性能。高速高速缓冲存冲存储器器(Cache)和写和写缓冲区冲区(WriteBuffers)位于主存位于主存储器和器和CPU之之间,主要用来提高存,主要用来提高存储系系统的性能。本的性能。本节主要介主要介绍与与这两种技两种技术相关的基本概念。相关的基本概念。1993年著名的ARM7诞生,之后的ARM9、ARM11风靡世界。随后出现了Cortex系列。实际上,Cortex就是ARM12。在“全国第七届嵌入式系统与单片机学术交流暨Cortex有两大分支:高性能的A8系列,主频可达到1GHz;低成本、计划与8/16位MCU竞争的M3系列905.4.1基本概念基本概念高速高速

66、缓冲存冲存储器是全部用硬件来器是全部用硬件来实现的,因此,它不的,因此,它不仅对应用程序用程序员是是透明的,而且透明的,而且对系系统程序程序员也是透明的。也是透明的。Cache与主存与主存储器之器之间以以块(CacheLine)为单位位进行数据交行数据交换。不同系不同系统中,中,Cache的的块大小也是不同的。通常大小也是不同的。通常Cache的的块大小大小为几个几个字。字。写写缓冲区是由一些高速的存冲区是由一些高速的存储器构成的。它主要用来器构成的。它主要用来优化向主存化向主存储器中器中的写入操作。当的写入操作。当CPU进行向主存行向主存储器中的写入操作器中的写入操作时,它先将数据写入,它先

67、将数据写入到写到写缓冲区中,由于写冲区中,由于写缓冲区的冲区的访问速度很高,速度很高,这种写入操作的速度将种写入操作的速度将很高。然后很高。然后CPU就可以就可以进行下面的操作。写行下面的操作。写缓冲区在适当的冲区在适当的时候以候以较低低的速度将数据写入到主存的速度将数据写入到主存储器中相器中相应的位置。的位置。通通过引入引入Cache和写和写缓冲区,存冲区,存储系系统的性能得到了很大的提高,但同的性能得到了很大的提高,但同时也也带来了一些来了一些问题。比如,由于数据将存在于系。比如,由于数据将存在于系统中不同的物理位置,中不同的物理位置,可能造成数据的不一致性;由于写可能造成数据的不一致性;

68、由于写缓冲区的冲区的优化作用,可能有些写操作化作用,可能有些写操作的的执行行顺序不是用序不是用户期望的期望的顺序,从而造成操作序,从而造成操作错误。915.4.2Cache的工作原理和地址映像方法的工作原理和地址映像方法1.Cache的工作原理的工作原理2.Cache地址映像和地址映像和变换方法方法(1)全相联映像方式(2)直接映像方式(3)组相联映像方式925.4.3Cache的分类的分类1.统一一/独立的数据独立的数据Cache和指令和指令Cache2.写通写通(Write-through)Cache和写回和写回(Write-back)Cache可靠性与主存的通信量控制的复杂性硬件实现的代

69、价3.读操作分配操作分配Cache和写操作分配和写操作分配Cache935.4.4Cache的替换算法的替换算法在把主存地址在把主存地址变换成成Cache地址的地址的过程中,如果程中,如果发现Cache块失效,失效,则需要从主存中需要从主存中调入一个新入一个新块到到Cache中。而来自主存中的中。而来自主存中的这个新个新块往往往往可以装入到可以装入到Cache的多个的多个块中。当可以装入中。当可以装入这个新个新块的几个的几个Cache块都都已已经装装满时,就要使用,就要使用cache替替换算法,从那些算法,从那些块中找出一个不常用的中找出一个不常用的块,把它,把它调回到主存中原来存放它的那个地

70、方,回到主存中原来存放它的那个地方,腾出一个出一个块存放从主存存放从主存中中调来的新来的新块。在。在ARM中常用的替中常用的替换算法有两种:随机替算法有两种:随机替换算法和算法和轮转法。法。(1)随机替换算法通过一个伪随机数发生器产生一个伪随机数,用新块将编号为该伪随机数的Cache块替换掉。这种算法很简单,易于实现。但是它没有考虑程序的局部性特点,也没有利用历史上的块地址流的分布情况,因而效果较差。同时这种算法不易预测最坏情况下Cache的性能。(2)轮转法维护一个逻辑的计数器,利用该计数器依次选择将要被替换出去的Cache块。这种算法容易预测最坏情况下Cache的性能。但它有一个明显的缺点

71、,在程序发生很小的变化时,可能造成Cache平均性能急剧的变化。945.4.5缓冲技术的使用注意事项缓冲技术的使用注意事项通常使用通常使用Cache和写和写缓冲可以提高系冲可以提高系统的性能,但是由于的性能,但是由于Cache和写和写缓冲区的使用可能改冲区的使用可能改变访问主存的数量、主存的数量、类型和型和时间,这些技些技术对于有些于有些类型的存型的存储访问是不适合的。本小是不适合的。本小节介介绍使用使用这些技些技术时的一些限制。的一些限制。Cache通常需要存通常需要存储器件具有下面的特性:器件具有下面的特性:读取操作将返回最后一次写入的内容,而且没有其他的副作用。写操作除了影响目标单元的内

72、容外,没有其他的副作用。对同一目标单元的两次连续读取操作将得到相同的结果。对同一目标单元的两次连续写取操作将会把第2次写操作的值写入目标单元,第1次写操作将没有意义。将存将存储区域区域设置成置成unbuffered是是为了防止延了防止延迟存存储访问操作的操作的执行行时间。对于写回于写回Cache如果如果设置置cached,必然造成存,必然造成存储访问操作操作执行的延行的延迟,因而写回因而写回类型的型的Cache不能不能设置成置成cached/buffered。在在C语言中,是通言中,是通过使用关使用关键词volatile声明存声明存储器映射的器映射的I/O空空间,来,来防止防止编译器在器在优化

73、化时删掉有用的存掉有用的存储访问操作的。操作的。955.4.6存储系统的一致性问题存储系统的一致性问题1.地址映射关系地址映射关系变化造成的数据不一致化造成的数据不一致2.指令指令Cache的数据一致性的数据一致性问题3.DMA造成的数据不一致造成的数据不一致问题将DMA访问的存储区域设置成非缓冲的(uncachable及unbufferable)。将DMA访问的存储区域所涉及的数据Cache块设置成无效,或者清空数据Cache。清空写缓冲区(执行写缓冲区中延迟的所有写操作)。在DMA操作期间限制处理器访问DMA所访问的存储区域。965.4.7Cache内容锁定内容锁定这里所里所说的的N锁定定

74、块被被锁定,是指定,是指编号号为0N-1的的锁定定块被被锁定在定在Cache中,中,编号号为NASSOCIATIVITY-1的的锁定定块可用于正常的可用于正常的cache替替换操作。操作。实现N锁定定块被被锁定的操作序列如下。定的操作序列如下。(1)确保在整个锁定过程中不会发生异常中断。否则,必须保证与该异常中断相关的代码和数据必须位于非缓冲(uncachable)的存储区域。(2)如果锁定的是指令Cache或者统一的Cache,必须保证锁定过程所执行的代码位于非缓冲的存储区域。(3)如果锁定的是数据Cache或者统一的Cache,必须保证锁定过程所涉及的数据位于非缓冲的存储区域。975.4.

75、7Cache内容锁定内容锁定(4)确保将要被锁定的代码和数据位于缓冲(cacheable)的存储区域。(5)确保将要被锁定的代码和数据尚未在Cache中,可以通过使无效相应的cache中的块达到这一目的。(6)对于I=0到N1,重复执行下面的操作:index=I写入寄存器C9,当使用B格式的锁定寄存器时,令L=1。对于锁定块I中的各Cache块内容从主存中预取到Cache中。对于数据Cache和统一Cache可以使用LDR指令读取一个位于该块中的数据,将该块预取到Cache中;对于指令Cache,通过操作寄存器C7,将相应的块预取到指令Cache中。(7)将index=N写入寄存器C9,当使用

76、B格式的锁定寄存器时,令L=0。解除解除N锁定定块的的锁定只需定只需执行下面的操作:将行下面的操作:将index=0写入写入寄存器寄存器C9。当使用。当使用B格式的格式的锁定寄存器定寄存器时,令,令L=0。985.4.8与与Cache和写缓冲区相关的编程接口和写缓冲区相关的编程接口1.寄存器寄存器C1中的相关位中的相关位2.寄存器寄存器C73.寄存器寄存器C9(1)寄存器C9的格式(2)访问寄存器C9的指令995.5快速上下文切换技术快速上下文切换技术快速上下文切快速上下文切换技技术(FastContextSwitchExtension,FCSE)通通过修改系修改系统中不同中不同进程的虚程的虚

77、拟地址,避免在地址,避免在进行行进程程间切切换时造成的虚造成的虚拟地地址到物理地址的重映射,从而提高系址到物理地址的重映射,从而提高系统的性能。的性能。本本节介介绍快速上下文切快速上下文切换技技术的原理及其的原理及其编程接程接口。口。1005.5.1快速上下文切换技术原理快速上下文切换技术原理快速上下文切快速上下文切换技技术(FCSE)的引入避免了的引入避免了这种开种开销。它位于。它位于CPU和和MMU之之间,如果两个,如果两个进程使用了同程使用了同样的虚的虚拟地址空地址空间,则对CPU而言,而言,两个两个进程使用了同程使用了同样的虚的虚拟地址空地址空间;快速上下文切;快速上下文切换机构机构对

78、各各进程的程的虚虚拟地址地址进行行变换,这样,系,系统中除了中除了CPU之外的部分看到的是之外的部分看到的是经过快快速上下文切速上下文切换机制机制变换的虚的虚拟地址。快速上下文切地址。快速上下文切换机制将各机制将各进程的虚程的虚拟空空间变换成不同的虚成不同的虚拟空空间。这样,在,在进行行进程程间切切换时,就不需要,就不需要进行虚行虚拟地址到物理地址的重映射了。地址到物理地址的重映射了。快速上下文切快速上下文切换机构将机构将CPU发出的每个虚出的每个虚拟地址按照上述的地址按照上述的规则进行行变换,然后,然后发送到系送到系统中的其他部分。中的其他部分。变换过程如程如图5.12所示。所示。1015.

79、5.2快速上下文切换技术编程接口快速上下文切换技术编程接口CP15中的寄存器中的寄存器C13用于快速上下文切用于快速上下文切换。其。其编码格式如下所示。格式如下所示。3125240访问寄存器寄存器C13的指令格式如下所示:的指令格式如下所示:MCRp15,0,c0,0MRCp15,0,c0,0当当PID的的值为0时,MVA=VA,相当于禁止了,相当于禁止了FCSE。系。系统复位后复位后PID即即为0。当当PID的的值不不为0时,相当于使能了,相当于使能了FCSE。102PID05.6与存储系统相关的程序设计指南与存储系统相关的程序设计指南本本节主要介主要介绍与与ARM存存储系系统相关的程序相关

80、的程序设计用到用到的一些概念。如果的一些概念。如果说前面的几章介前面的几章介绍了了ARM存存储系系统内部的内部的结构,本构,本节是从外部来看是从外部来看ARM的存的存储系系统,即即ARM存存储系系统提供的提供的对外接口。当用外接口。当用户通通过这些些接口来接口来访问ARM存存储系系统时,需要遵守一定的,需要遵守一定的规则,本本节将介将介绍这些些规则。1035.6.1地址空间地址空间ARM体系使用体系使用单一的普通地址空一的普通地址空间。该地址空地址空间的的大小大小为232个个8位字位字节。这些字些字节单元的地址是一个元的地址是一个无符号的无符号的32位数位数值,其取,其取值范范围为0232-1

81、。ARM的地址空的地址空间也可以看作是也可以看作是230个个32位的字位的字单元。元。这些字些字单元的地址可以被元的地址可以被4整除,也就是整除,也就是说,该地地址的低两位址的低两位为0b00。地址。地址为A的字数据包括地址的字数据包括地址为A、A+1、A+2、A+3四个字四个字节单元的内容。元的内容。在在ARM版本版本4及以上的版本中,及以上的版本中,ARM的地址空的地址空间也也可以看作是可以看作是231个个16位的半字位的半字单元。元。这些半字些半字单元的元的地址可以被地址可以被2整除,也就是整除,也就是说,该地址的最低位地址的最低位为0b0。地址。地址为A的半字数据包括地址的半字数据包括

82、地址为A、A+1两个两个字字节单元的内容。元的内容。1045.6.1地址空间地址空间各存各存储单元的地址作元的地址作为32位的无符号数,可以位的无符号数,可以进行常行常规的整数运算。的整数运算。这些运算的些运算的结果果进行行232取模。即运算取模。即运算结果果发生上溢出和下溢出生上溢出和下溢出时,地址将,地址将会会发生卷生卷绕。比如,如果运算。比如,如果运算结果果为(0xffffffff+0x80),实际上地址上地址值为0x80。为了使程序便于和将来版本兼容,在程序中尽量使地址运算的了使程序便于和将来版本兼容,在程序中尽量使地址运算的结果在果在00xffffffff之之间。如果程序中跳。如果程

83、序中跳转指令的目指令的目标地址依地址依赖于地址于地址值卷卷绕,则指令指令执行的行的结果将不可果将不可预知。所以在程序中知。所以在程序中应该保保证向前跳向前跳转不不超超过0xffffffff,向后跳,向后跳转不超不超过0x0。在程序的正常在程序的正常执行行时,每,每执行一条行一条ARM指令,当前指令指令,当前指令计数器数器值加加4个个字字节;每;每执行一条行一条Thumb指令,当前指令指令,当前指令计数器数器值加加2个字个字节。但是,。但是,当当发生地址生地址值上溢出上溢出时,执行的行的结果将是不可果将是不可预知的。知的。LDC、LDM、STC及及STM指令可能指令可能访问一段一段连续的存的存储

84、单元。每元。每执行一行一次次读取取/写入操作,目写入操作,目标单元的地址元的地址值加加4个字个字节。如果。如果这种地址更新造种地址更新造成地址成地址值上溢出,上溢出,则指令指令执行的行的结果将是不可果将是不可预知的。知的。1055.6.2存储器的格式存储器的格式在在ARM中,如果地址中,如果地址A是字是字对齐的,有下面几种:的,有下面几种:地址地址为A的字的字单元包括字元包括字节单元元A、A+1、A+2及及A+3。地址为A的半字单元包括字节单元A、A+1。地址为A+2的半字单元包括字节单元A+2、A+3。地址为A的字单元包括半字单元A、A+2。这样,每个字,每个字单元中包含元中包含4个字个字节

85、单元或者两个半元或者两个半字字单元;一个半字元;一个半字单元中包含两个字元中包含两个字节单元。但是元。但是在字在字单元中,元中,4个字个字节哪一个是高位字哪一个是高位字节,哪一个,哪一个是低位字是低位字节则有两种不同的格式:有两种不同的格式:Big-endian格式格式和和Little-endian格式。格式。1065.6.3非对齐的存储访问操作非对齐的存储访问操作1.非非对齐的指令的指令预取操作取操作2.非非对齐的数据的数据访问操作操作执行的结果不可预知。忽略字单元地址的低两位的值,即访问地址为(AddressAND0XFFFFFFC)的字单元;忽略半字单元地址的最低位的值,即访问地址为(A

86、ddressAND0XFFFFFFE)的半字单元。忽略字单元地址值中的低两位的值;忽略半字单元地址的最低位的值。由存储系统实现这种“忽略”。也就是说,这时该地址值原封不动地送到存储系统。1075.6.4指令预取和自修改代码指令预取和自修改代码在在ARM中允中允许指令指令预取。在取。在CPU执行当前指令的同行当前指令的同时,可以从存,可以从存储器器中中预取其后的若干条指令,具体取其后的若干条指令,具体预取多少条指令,不同的取多少条指令,不同的ARM实现中有中有不同的数不同的数值。当用当用户读取取PC寄存器的寄存器的值时,返回的是当前指令下面第,返回的是当前指令下面第2条指令的地址。条指令的地址。

87、预取的指令并不一定能取的指令并不一定能够得到得到执行。行。正如在不同的正如在不同的ARM实现中,中,预取的指令条数可能不同,当取的指令条数可能不同,当发生程序跳生程序跳转时,不同的,不同的ARM实现中采用的跳中采用的跳转预测算法也可能不同。算法也可能不同。自修改代自修改代码指的是代指的是代码在在执行行过程中可能修改自身。程中可能修改自身。对于支持指令于支持指令预取的取的ARM系系统,自修改代,自修改代码可能可能带来潜在的来潜在的问题。当指。当指令被令被预取后,在取后,在该指令被指令被执行前,如果有数据行前,如果有数据访问指令修改了位于主存指令修改了位于主存中的中的该指令,指令,这时被被预取的指

88、令和主存中取的指令和主存中对应的指令不同,从而可能使的指令不同,从而可能使执行的行的结果果发生生错误。1085.6.5IMBIMB是一段特定的代是一段特定的代码序列,序列,对于每种不同的于每种不同的ARM实现,对应有不同的有不同的IMB。IMB在新的指令被保存在新的指令被保存到主存中后,在到主存中后,在该指令被指令被实际执行之前行之前执行,使得行,使得可自修改代可自修改代码在在ARM体系中能体系中能够可靠地可靠地执行。行。在很多在很多ARM系系统中,中,IMB中需要的很多指令中需要的很多指令(如使如使无效无效Cache等操作等操作)只能运行在系只能运行在系统模式下。模式下。对于包含于包含24位

89、立即数的位立即数的SWI指令,通常使用下面的指令,通常使用下面的SWI功能功能调用提供用提供IMB功能:功能:SWI0XF000001095.6.5IMB同同样,在其他的一些,在其他的一些场合也需要在适当的合也需要在适当的时候运行候运行适当的适当的IMB。下面介。下面介绍这些些IMB的的应用用场合。合。(1)对于采用了虚拟地址到物理地址映射的系统,如果在指令预取之后和该指令得到实际执行之前,虚拟地址到物理地址的映射关系发生了改变,这时也需要运行适当的IMB。(2)如果在指令预取之后和该指令得到实际执行之前,该指令所涉及到的存储区域的访问权限发生了改变(由允许访问变成了不允许访问,或者由不允许访

90、问变成了允许访问),这时也需要运行适当的IMB。这种情况下的IMB中,一般不需要使无效Cache中相关的内容,运行代价相对较低。1105.6.6存储器映射的存储器映射的I/O空间空间在在ARM中,中,I/O操作通常被映射成存操作通常被映射成存储器操作。器操作。I/O的的输出操出操作可以通作可以通过存存储器写入操作器写入操作实现;I/O的的输入操作可以通入操作可以通过存存储器器读取操作取操作实现。这样I/O空空间就被映射成了存就被映射成了存储空空间。这些存些存储器映射的器映射的I/O空空间不不满足足Cache所要求的上述特性。所要求的上述特性。由于写由于写缓冲技冲技术可能推可能推迟写操作,它同写

91、操作,它同样不适合不适合对于存于存储器器映射的映射的I/O空空间的操作。比如当的操作。比如当CPU向中断控制器的向中断控制器的I/O端口端口写写ACK,清除当前中断,清除当前中断请求求标志位,并重新使能中断志位,并重新使能中断请求。求。如果使用了写如果使用了写缓冲技冲技术,CPU的写操作将被先写入高速的的写操作将被先写入高速的缓冲区。高速的冲区。高速的缓冲区可能在以后某个冲区可能在以后某个时间再将再将结果写到果写到I/O端口,端口,这样就造成一种假象,似乎外就造成一种假象,似乎外设又又发出了中断出了中断请求。求。1115.6.6存储器映射的存储器映射的I/O空间空间将存将存储区域区域设置成置成

92、unbuffered是是为了防止延了防止延迟存存储访问操作的操作的执行行时间。对于写回于写回Cache如果如果设置置cached必然造成存必然造成存储访问操作操作执行的延行的延迟,因而,因而写回写回类型的型的Cache不能不能设置成置成cached/buffered。将存将存储器映射的器映射的I/O空空间设置成置成uncached是是为了有了有效地防止硬件系效地防止硬件系统优化化时删掉有用的存掉有用的存储访问操作。操作。如果在高如果在高级语言中言中访问存存储器映射的器映射的I/O空空间时,仅仅将存将存储器映射的器映射的I/O空空间设置成置成uncached,是不,是不够的。的。还必必须告告诉编

93、译器不要在器不要在优化化时删掉有用的掉有用的存存储访问操作。在操作。在C语言中是通言中是通过使用关使用关键词volatile声明存声明存储器映射的器映射的I/O空空间来防止来防止编译器在器在优化化时删掉有用的存掉有用的存储访问操作。操作。1125.7ARM存储系统的实例存储系统的实例LinkUp公司生公司生产的的L7205芯片是一款芯片是一款ARM720T微微处理器。理器。它内部包含了功能它内部包含了功能强大的大的MMU。可以。可以连接多种存接多种存储设备,包括包括512字字节的芯片内的芯片内ROM,5KB的芯片内的芯片内SRAM,可以在,可以在芯片外芯片外扩充充SRAM/Flash,可以在芯

94、片外,可以在芯片外扩充充SDRAM。其。其存存储器可以被器可以被CPU、DMA以及以及LCD部分部分访问。L7205SDB是是LinkUp设计的基于的基于L7205芯片的芯片的评价板,价板,该评价板包含价板包含一个一个L7205芯片、芯片、32MB的的SDRAM、两个、两个SRAM/Flash扩展展槽。系槽。系统有两种启有两种启动方式,可以通方式,可以通过控制面板上的跳控制面板上的跳线进行行选择。本章将比本章将比较详细地描述地描述L7205SDB存存储系系统及其配置方法,及其配置方法,也可以作也可以作为设计其他基于其他基于ARM的嵌入系的嵌入系统存存储系系统的参考。的参考。1135.7.1L7

95、205的存储系统概述的存储系统概述L7205芯片是一款芯片是一款ARM720T的微的微处理器。理器。ARM720T微微处理器中集成了理器中集成了ARM7TDMI微微处理器内核、理器内核、8KB的的Cache、写、写缓冲区以及存冲区以及存储器管理器管理单元元MMU。ARM7TDMI微微处理器内核是理器内核是ARM7处理器系列理器系列成成员之一。它与之一。它与ARM体系的体系的指令系指令系统是兼容的。是兼容的。L7205的存的存储系系统包含了包含了512字字节的芯片内的芯片内ROM、5KB的的芯片内芯片内SRAM,存,存储器映射的器映射的I/O空空间,可以在芯片外,可以在芯片外扩充充SRAM/Fl

96、ash,可以在芯片外,可以在芯片外扩充充SDRAM。其地址空。其地址空间映映射如射如图5.15所示。所示。1145.7.2L7205中的中的SDRAML7205中可以中可以扩展两个展两个SDRAM槽。槽。SDRAM的存的存储空空间为0XF0000000XFFFFFFFF。为能使能使SDRAM占据占据连续的存的存储空空间,将两个槽的,将两个槽的SDRAM都向地址都向地址0XF0FFFFFF靠靠拢,即槽,即槽1中的最高地址中的最高地址为0XF0FFFFFF,槽,槽2中的最低地址中的最低地址为0XF1000000。比如,当每个槽中。比如,当每个槽中DRAM大小大小为8MB时,SDRAM的地址空的地址

97、空间如如图5.16所示。所示。当每个槽中当每个槽中SDRAM大小大小为16MB时,SDRAM的地的地址空址空间如如图5.17所示。所示。1155.7.2L7205中的中的SDRAM1.L7205中中DRAM的的编程接口程接口2.自自动识别L7205SDB上上DRAM器件的大小器件的大小1165.7.3L7205中的中的MMUL7205的的MMU中包括两中包括两级的的页表。在程序表。在程序5.3中中实现了一了一级表,表,这里的里的讨论也主要集中在一也主要集中在一级页表。表。一一级页表的粒度表的粒度为1MB,页表的大小表的大小为16KB。L7205中将一中将一级页表放置在表放置在SDRAM地址空地

98、址空间最高最高端的端的16KB区域。在区域。在L7205SDB中,每个中,每个SDRAM扩展槽中的存展槽中的存储器大小器大小为16MB,这样,一,一级页表就表就放置在放置在(0xf2000000-16KB0xf1ffc000)开始的开始的16KB的区域内。由于一的区域内。由于一级页表粒度表粒度为1MB,实际上一上一级页表放置在基地址表放置在基地址为0xf1f00000的存的存储页中。中。存存储单元元0Xf1ffbff4中保存了一中保存了一级页表的物理地址,表的物理地址,任何任何时候都可以通候都可以通过该指指针访问一一级页表。表。117第第6章章ATPCS介绍介绍ATPCS即即ARM-THUMB

99、procedurecallstandard的的简称。称。PCS规定了定了应用程序的函数可以如何分开地写,分用程序的函数可以如何分开地写,分开地开地编译,最后将它,最后将它们连接在一起,所以它接在一起,所以它实际上定上定义了了一套有关一套有关过程(函数)程(函数)调用者与被用者与被调用者之用者之间的的协议。为了使了使单独独编译的的C语言程序和言程序和汇编程序之程序之间能能够相互相互调用,必用,必须为子程序子程序间的的调用制定用制定一定的一定的规则。ATPCS就是就是ARM程序和程序和Thumb程序中子程序程序中子程序调用的基本用的基本规则。1196.1ATPCS概述概述ATPCS规定了一些子程序

100、定了一些子程序间调用的基本用的基本规则。这些些基本基本规则包括子程序包括子程序调用用过程中寄存器的使用程中寄存器的使用规则、数据数据栈的使用的使用规则、参数的、参数的传递规则。为适适应一些一些特定的需要,特定的需要,对这些基本的些基本的调用用规则进行一些修改,行一些修改,得到几种不同的子程序得到几种不同的子程序调用用规则。这些特定的些特定的调用用规则包括:包括:支持数据栈限制检查的ATPCS。支持只读段位置无关(ROPI)的ATPCS。支持可读写段位置无关(RWPI)的ATPCS。支持ARM程序和Thumb程序混合使用的ATPCS。处理浮点运算的ATPCS。1206.1ATPCS概述概述使用使

101、用ADS的的C语言言编译器器编译的的C语言子程序言子程序满足足用用户指定的指定的ATPCS类型。而型。而对于于汇编语言程序来言程序来说,完全要依完全要依赖用用户来保来保证各子程序各子程序满足足选定的定的ATPCS类型。具体来型。具体来说,汇编语言子程序必言子程序必须满足下面足下面3个条件:个条件:在子程序编写时必须遵守相应的ATPCS规则。数据栈的使用要遵守相应的ATPCS规则。在汇编编译器中使用apcs选项。1216.2基本基本ATPCS基本基本ATPCS规定了在子程序定了在子程序调用用时的一些基本的一些基本规则,包括下面包括下面3方面的内容:方面的内容:各寄存器的使用规则及其相应的名称。数

102、据栈的使用规则。参数传递的规则。相相对于其他于其他类型的型的ATPCS,满足基本足基本ATPCS的程的程序的序的执行速度更快,所占用的内存更少。但是它不行速度更快,所占用的内存更少。但是它不能提供以下的支持:能提供以下的支持:ARM程序和Thumb程序相互调用。数据以及代码的位置无关的支持。子程序的可重入性。数据栈检查的支持。1226.2.1寄存器的使用规则寄存器的使用规则寄存器的使用必寄存器的使用必须满足下面的足下面的规则:子程序间通过寄存器R0R3来传递参数。这时,寄存器R0R3可以记作A0A3。被调用的子程序在返回前无须恢复寄存器R0R3的内容。在子程序中,使用寄存器R4R11来保存局部

103、变量。这时,寄存器R4R11可以记作V1V8。如果在子程序中使用到了寄存器V1V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4R7来保存局部变量。寄存器R12用作子程序间的scratch寄存器,记作ip。在子程序间的连接代码段中常有这种使用规则。在函数返回时使用该寄存器出栈1236.2.1寄存器的使用规则寄存器的使用规则寄存器R13用作数据栈指针,记作sp。在子程序中,寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。寄存器R14

104、称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。寄存器R15是程序计数器,记作pc。它不能用作其他用途。124Uboot程序中主程序调用cpu_init_crit函数,在这个cpu_init_crit函数中有下面的代码:movip,lrbllowlevel_initmovlr,ipmovpc,lr这个代码在调用lowlevel_init函数之前,先将lr存储在R12,之后在lowlevel_init函数调用返回之后使用movlr,ip将之前保存的返回地址再一次存储到lr寄存器。1256.2.2数据栈的使用规则数据栈的使用规则栈

105、指指针通常可以指向不同的位置。当通常可以指向不同的位置。当栈指指针指向指向栈顶元素元素(即最后一个入即最后一个入栈的数据元素的数据元素)时,称,称为FULL栈;当;当栈指指针指向与指向与栈顶元素相元素相邻的一个可用数据的一个可用数据单元元时,称,称为EMPTY栈。数据数据栈的增的增长方向也可以不同。当数据方向也可以不同。当数据栈向内存地址减小的向内存地址减小的方向增方向增长时,称,称为DESCENDING栈;当数据;当数据栈向内存地址向内存地址增加的方向增增加的方向增长时,称,称为ASCENDING栈。综合合这两种特点,可以有以下两种特点,可以有以下4种数据种数据栈。FD:FullDescen

106、ding。ED:EmptyDescending。FA:FullAscending。EA:EmptyAscending。1266.2.2数据栈的使用规则数据栈的使用规则ATPCS规定数据定数据栈为FD类型,并且型,并且对数据数据栈的操的操作是作是8字字节对齐的。下面是一个数据的。下面是一个数据栈的示例的示例(如如图6.1所示所示)及其相关的名及其相关的名词。数据栈的栈指针(StackPointer)数据栈的基地址(StackBase)数据栈界限(StackLimit)已占用的数据栈(UsedStack)未占用的数据栈(UnusedStack)数据栈中的数据帧(StackFrames)1276.2

107、.2数据栈的使用规则数据栈的使用规则在在ARMv5TE中,批量中,批量传送指令送指令LDRD/STRD要求要求数据数据栈是是8字字节对齐的,以提高数据的,以提高数据传送的速度。送的速度。用用ADS编译器器产生的目生的目标文件中,外部接口的数据文件中,外部接口的数据栈都是都是8字字节对齐的,并且的,并且编译器将告器将告诉连接器:接器:本目本目标文件中的数据文件中的数据栈是是8字字节对齐的。而的。而对于于汇编程序来程序来说,如果目,如果目标文件中包含了外部文件中包含了外部调用,用,则必必须满足下列条件:足下列条件:外部接口的数据栈必须是8字节对齐的。也就是要保证在进入该汇编代码后,直到该汇编代码调

108、用外部程序之间,数据栈的栈指针变化偶数个字(如栈指针加2个字,而不能为加3个字)。在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序数据栈是8字节对齐的。1286.2.3参数传递规则参数传递规则1.参数个数可参数个数可变的子程序的参数的子程序的参数传递规则对于参数个数可于参数个数可变的子程序,但参数不超的子程序,但参数不超过4个个时,可以使用寄存器,可以使用寄存器R0R3来来传递参数;当参数超参数;当参数超过4个个时,还可以使用数据可以使用数据栈来来传递参数。参数。在参数在参数传递时,将所有参数看作是存放在,将所有参数看作是存放在连续的内存的内存单元中的字数据。然后,元中的字数据。

109、然后,依次将各字数据依次将各字数据传送到寄存器送到寄存器R0、R1、R2、R3中,如果参数多于中,如果参数多于4个,将剩余的个,将剩余的字数据字数据传送到数据送到数据栈中,入中,入栈的的顺序与参数序与参数顺序相反,即最后一个字数据先入序相反,即最后一个字数据先入栈。按照上面的按照上面的规则,一个浮点参数可以通,一个浮点参数可以通过寄存器寄存器传递,也可以通,也可以通过数据数据栈传递。2.参数个数固定的子程序的参数参数个数固定的子程序的参数传递规则各个浮点参数按顺序处理。为每个浮点参数分配FP寄存器。分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器。1291301316.2.3

110、参数传递规则参数传递规则3.子程序子程序结果返回果返回规则结果为一个32位的整数时,可以通过寄存器R0返回。结果为一个64位整数时,可以通过寄存器R0和R1返回,依次类推。结果为一个浮点数时,可以通过浮点运算部件的寄存器f0、d0或者s0来返回。结果为复合型的浮点数(如复数)时,可以通过寄存器f0fN或者d0dN来返回。对于位数更多的结果,需要通过内存来传递。1326.3几种特定的几种特定的ATPCS几种特定的几种特定的ATPCS是在遵守基本的是在遵守基本的ATPCS同同时,增加一些,增加一些规则以支持一些特定的功能。以支持一些特定的功能。1336.3.1支持数据栈限制检查的支持数据栈限制检查

111、的ATPCS1.支持数据支持数据栈限制限制检查的的ATPCS的基本原理的基本原理2.编写遵守支持数据写遵守支持数据栈限制限制检查的的ATPCS的的汇编语言程序言程序(1)数据栈小于256字节的叶子子程序(2)数据栈小于256字节的非叶子子程序(3)数据栈大于256字节的子程序1346.3.2支持只读段位置无关支持只读段位置无关(ROPI)的的ATPCS1.支持只支持只读段位置无关段位置无关(ROPI)的的ATPCS的的应用用场合合程序在运行期间动态加载到内存中。程序在不同的场合,与不同的程序组合后加载到内存中。在运行期间映射到不同的地址。在一些嵌入式系统中,将程序发在ROM中,运行时再加载到R

112、AM中不同的地址。2.遵守支持只遵守支持只读段位置无关段位置无关(ROPI)的的ATPCS的程序的程序设计当ROPI段中的代码引用同一个ROPI段中的符号时,必须是基于PC的。当ROPI段中的代码引用另一个ROPI段中的符号时,必须是基于PC的,并且两个ROPI段的位置关系必须固定。其他被ROPI段中的代码引用的必须是绝对地址,或是基于sb的可写数据。ROPI段移动后,对ROPI中符号的引用要做相应的调整。1356.3.3支持可读写段位置无关支持可读写段位置无关(RWPI)的的ATPCS如果一个程序中所有的可如果一个程序中所有的可读写段都是位置无关,写段都是位置无关,则称称该程序遵守支持可程序

113、遵守支持可读写段位置无关写段位置无关(RWPI)的的ATPCS。使用支持可。使用支持可读写段位置无关写段位置无关(RWPI)的的ATPCS可以避免必可以避免必须将程序存放到特定的位置。将程序存放到特定的位置。这时寄存器寄存器R9通常用作静通常用作静态基址寄存器,基址寄存器,记作作sb。可重入的子程序可以在内存中同可重入的子程序可以在内存中同时有多个有多个实例,各例,各个个实例例拥有独立的可有独立的可读写段。在生成一个新的写段。在生成一个新的实例例时,sb指向指向该实例的可例的可读写段。写段。RWPI段中的符号段中的符号的的计算方法算方法为:连接器首先接器首先计算出算出该符号相符号相对于于RWP

114、I段中某一特定位置的偏移量,通常段中某一特定位置的偏移量,通常该特定位特定位置置选为RWPI段的第一个字段的第一个字节处;在程序运行;在程序运行时,将将该偏移量加到偏移量加到sb上,即可生成上,即可生成该符号的地址。符号的地址。1366.3.4支持支持ARM程序和程序和Thumb程序混合使用的程序混合使用的ATPCS在在编译或者或者汇编时,使用,使用/interwork告告诉编译器器(或或汇编器器)生成的目生成的目标代代码遵守支持遵守支持ARM程序和程序和Thumb程序混合使用的程序混合使用的ATPCS。它用在以下。它用在以下场合:合:程序中存在ARM程序调用Thumb程序的情况。程序中存在T

115、humb程序调用ARM程序的情况。需要连接器来进行ARM状态和Thumb状态切换的情况。在下述情况下,使用选项/nointerwork。程序中不包含Thumb程序。用户自己进行ARM状态和Thumb状态切换。其中,选项/nointerwork是默认的选项。1376.3.5处理浮点运算的处理浮点运算的ATPCSATPCS支持支持VFP体系和体系和FPA体系两种不同的浮点硬体系两种不同的浮点硬件体系和指令集。两种体系件体系和指令集。两种体系对应的代的代码不兼容。不兼容。相相应地,地,ADS的的编译器和器和汇编器有下面器有下面6种与浮点种与浮点数相关的数相关的选项:fpuVFPfpuFPAfpuso

116、ftVFPfpusoftVFP+VFPfpusoftFPAfpunone1386.3.5处理浮点运算的处理浮点运算的ATPCS当系当系统中包含有浮点运算部件,并且想在中包含有浮点运算部件,并且想在Thumb程程序中使用浮点数子程序序中使用浮点数子程序时,可以,可以选择选项-fpusoftVFP+VFP。当系当系统中没有浮点运算部件中没有浮点运算部件时,分,分3种情况考种情况考虑:如果程序要与FPA体系兼容,应选择选项fpusoftFPA。如果程序中没有浮点算术运算,并且程序要和FPA体系和VFP体系都兼容,应选择选项fpunone。其他情况下选择选项fpusoftVFP。139第7章ARM程序

117、和Thumb程序混合使用ARM体系体系结构支持构支持ARM程序和程序和Thumb程序混合程序混合使用。本章介使用。本章介绍ARM程序和程序和Thumb程序混合使程序混合使用用时需要的相关技需要的相关技术。1417.1概概述述1.ARM程序和程序和Thumb程序混合使用的程序混合使用的场合合强调速度的场合有一些功能只有ARM程序能够完成当处理器进入异常中断处理程序时,程序状态自动切换到ARM状态ARM处理器总是从ARM状态开始执行2.在在编译或者或者汇编时使用使用选项apcs/interwork1427.2在汇编语言程序中通过用户代码支持在汇编语言程序中通过用户代码支持interwork对于于C

118、/C+源程序而言,只要在源程序而言,只要在编译时指定指定-apcs/interwork选项,连接器生成的代接器生成的代码就遵守支持就遵守支持ARM程序和程序和Thumb程序混合使用的程序混合使用的ATPCS。而。而对于于汇编源程序而言,源程序而言,用用户必必须保保证编写的代写的代码遵守支持遵守支持ARM程序和程序和Thumb程序程序混合使用的混合使用的ATPCS。对于于汇编程序来程序来说,可以有两种方法来,可以有两种方法来实现程序状程序状态的切的切换。第一种方法是利用第一种方法是利用连接器提供的小程序接器提供的小程序(veneers)来来实现程程序状序状态的切的切换,这时用用户可以使用指令可以

119、使用指令BL来来调用子程序;用子程序;另一种方法是用另一种方法是用户自己自己编写状写状态切切换的程序,的程序,这种方法种方法编写写的程序需要的代的程序需要的代码更少,运行的速度更快。本更少,运行的速度更快。本节主要介主要介绍第第二种方法。二种方法。这里介里介绍ARM中与中与这个个问题相关的指令、相关的指令、伪操作以及程序操作以及程序设计。1437.2.1可以实现程序状态切换的指令可以实现程序状态切换的指令1.BX指令指令2.第第1种格式的种格式的BLX指令指令BLX(1)3.第第2种格式的种格式的BLX指令指令BLX(2)4.LDR、LDM及及POP指令用于程序状指令用于程序状态的切的切换14

120、47.2.2与程序状态切换相关的伪操作与程序状态切换相关的伪操作ARM汇编器既可以器既可以处理理ARM指令,也可以指令,也可以处理理Thumb指令。指令。这时,通,通过下面两个下面两个伪操作告操作告诉ARM汇编器将要器将要处理的是理的是哪一种指令。哪一种指令。CODE16伪操作:告诉汇编编译器后面的指令序列为16位的Thumb指令。CODE32伪操作:告诉汇编编译器后面的指令序列为32位的ARM指令。语法格式法格式CODE16CODE32使用使用说明明当汇编源程序中同时包含ARM指令和Thumb指令时,使用CODE16伪操作告诉汇编编译器后面的指令序列为16位的Thumb指令;使用CODE32

121、伪操作告诉汇编编译器后面的指令序列为32位的ARM指令。但是,CODE16伪操作和CODE32伪操作只是告诉编译器后面指令的类型,该伪操作本身并不进行程序状态的切换。1457.2.3进行状态切换的汇编程序实例进行状态切换的汇编程序实例下面下面给出一个状出一个状态切切换汇编程序的例子:程序的例子:参见教材P255可以通可以通过下面的步下面的步骤来来编译和运行上面的例子。和运行上面的例子。(1)用文本编辑器将上述代码输入,并保存成文件addreg.s。(2)用asmgaddreg.s命令行汇编该程序。(3)用armlinkaddreg.ooaddreg命令行连接生成映像文件。(4)用armsdad

122、dreg加载该映像文件。(5)通过step单步跟踪该程序。1461477.3在在C/C+程序中实现程序中实现interwork1.需要考需要考虑interwork的的场合合如果C/C+程序中包含需要返回到另一种程序状态的子程序,需要在编译该C/C+程序时指定选项apcs/interwork。如果C/C+程序间接地调用另一种指令系统的子程序,或者C/C+程序中地虚函数调用另一种指令系统的子程序时,需要在编译该C/C+程序时指定apcs/interwork选项。如果调用者程序和被调用的程序是不同指令集的,而被调用者是noninterwork代码,这时,不要使用函数指针来调用该被调用程序。总地来说,

123、当程序中包含了Thumb指令和ARM指令时,使用函数指针时,要特别注意。如果在连接时目标文件中包含了Thumb程序,这时,连接器会选择ThumbC/C+库进行连接。通常情况下,如果不能肯定程序中不进行程序状态切换,使用编译选项apcs/interwork来编译程序。1487.3在在C/C+程序中实现程序中实现interwork2.编译选项-apcs/interwork的作用的作用当C/C+程序中包含了程序状态切换时,可以在编译时指定编译选项apcs/interwork,格式如下:tccapcs/interworkarmccapcs/interworktcppapcs/interworkarmc

124、ppapcs/interwork3.C语言的言的interwork实例例参见教材P2581497.4在汇编语言程序中通过连接器支持在汇编语言程序中通过连接器支持interwork7.2节中,介中,介绍了用了用户在在汇编程序中如何程序中如何编写写实现程程序状序状态切切换的代的代码。本。本节介介绍利用利用连接器生成的代接器生成的代码段段实现在在汇编程序之程序之间以及以及汇编程序和程序和C/C+程程序之序之间实现程序状程序状态的切的切换。通常,将通常,将连接器生成的用于程序状接器生成的用于程序状态切切换的代的代码段段称称为veneers。1507.4.1利用利用veneers实现汇编程序间的程序状态

125、切换实现汇编程序间的程序状态切换利用利用veneers实现汇编程序程序间的程序状的程序状态切切换时,可以按照下面的方式来可以按照下面的方式来编写写汇编程序。由于利用了程序。由于利用了连接器生成的接器生成的veneers,汇编程序的程序的编写方法与写方法与7.2节中有所不同。中有所不同。调用者程序(Caller)可以不考虑程序状态切换的问题。它使用BL指令来调用子程序,在编译时可以指定编译选项apcs/interwork,也可以指定编译选项apcs/nointerwork。被调用的子程序(Callee)使用BX指令返回,在编译时,要指定编译选项apcs/interwork。1517.4.2利用利

126、用veneers实现汇编程序与实现汇编程序与C/C+程序间的程序状态切换程序间的程序状态切换处于一种程序状于一种程序状态(ARM状状态或者或者Thumb状状态)的的C/C+程程序可以序可以调用用处于另一种程序状于另一种程序状态(Thumb状状态或者或者ARM状状态)的的汇编语言程序。言程序。这时,程序的,程序的编写写应符合下面的符合下面的规则:C/C+程序可以不必关心程序状态的切换,编译时可以指定编译选项apcs/interwork,也可以指定编译选项apcs/nointerwork。被调用的汇编程序使用BX指令返回,并且编译时必须指定编译选项apcs/interwork。处于一种程序状于一种

127、程序状态(ARM状状态或者或者Thumb状状态)的的汇编语言言程序可以程序可以调用用处于另一种程序状于另一种程序状态(Thumb状状态或者或者ARM状状态)的的C/C+程序。程序。这时程序的程序的编写写应符合下面的符合下面的规则:汇编程序可以不必关心程序状态的切换,使用BL指令调用子程序,编译时可以指定编译选项apcs/interwork,也可以指定编译选项apcs/nointerwork。被调用的C/C+程序编译时必须指定编译选项apcs/interwork。152第第8章章C/C+以及汇编语言的混合编程以及汇编语言的混合编程ARM体系体系结构支持构支持C、C+以及以及汇编语言的混合言的混合

128、使用,本章介使用,本章介绍这些相关的技些相关的技术。1548.1内嵌汇编器的使用内嵌汇编器的使用内嵌内嵌汇编器指的是包含在器指的是包含在C/C+编译器中的器中的汇编器。器。使用内嵌使用内嵌汇编器后,可以在器后,可以在C/C+源程序中直接使源程序中直接使用大部分的用大部分的ARM指令和指令和Thumb指令。使用内嵌指令。使用内嵌汇编器可以在器可以在C/C+程序中程序中实现C/C+语言不能言不能够完完成的一些操作;同成的一些操作;同时程序的代程序的代码效率也比效率也比较高。高。1558.1.1内嵌的汇编指令用法内嵌的汇编指令用法1.操作数操作数2.物理寄存器物理寄存器3.常量常量4.指令展开指令展

129、开5.标号号6.内存内存单元的分配元的分配7.SWI和和BL指令的使用指令的使用1568.1.2内嵌的汇编器和内嵌的汇编器和armasm的区别的区别与与armasm相比,内嵌的相比,内嵌的汇编器在功能和使用方法器在功能和使用方法上主要有以下特点:上主要有以下特点:使用内嵌的汇编器,不能通过寄存器PC返回当前指令的地址。内嵌的汇编器不支持伪指令“LDRRn,=expression”,这条伪指令可以用指令“MOVRn,expression”来代替。不支持标号表达式。不支持ADR、ADRL伪指令。十六进制数前要使用前缀0x,不能使用&。编译器可能使用寄存器R0到R3、ip及lr存放中间结果,因此在使

130、用这些寄存器时要非常小心。1578.1.2内嵌的汇编器和内嵌的汇编器和armasm的区别的区别CPSR寄存器中的NZCV条件标志位可能会被编译器破坏,因此在指令中使用这些标志位时要非常小心。指令中使用的C变量不要与任何物理寄存器同名,否则会造成混乱。LDM与STM指令的寄存器列表中只能使用物理寄存器,不能使用C表达式。指令不能写寄存器PC。不支持指令BX及BLX。用户不要维护数据栈。通常编译器根据需要自动保存和恢复工作寄存器的值,用户不需要去保护和恢复这些工作寄存器的值。用户可以改变处理器模式,但是编译器并不了解处理器模式的改变。这样,如果用户改变了处理器模式,将不能使用原来的C/C+表达式,

131、重新恢复到原来的处理器模式后,才能再使用这些C/C+表达式。1588.1.3在在C/C+ 程序中使用内嵌的汇编指令程序中使用内嵌的汇编指令1.在在C/C+程序中使用内嵌的程序中使用内嵌的汇编指令的指令的语法法格式格式2.在在C/C+程序中使用内嵌程序中使用内嵌汇编指令指令时的注意事的注意事项1598.1.4内嵌汇编指令的应用举例内嵌汇编指令的应用举例1.字符串复制字符串复制程序8.1字符串复制2.使能和禁止中断使能和禁止中断程序8.2使能和禁止异常中断3.点点积程序8.3点积操作1608.2从汇编程序中访问从汇编程序中访问C程序变量程序变量在在C程序中声明的全局程序中声明的全局变量可以被量可以

132、被汇编程序通程序通过地地址址间接地接地访问。具体。具体访问方法如下所示:方法如下所示:使用IMPORT伪操作声明该全局变量。使用LDR指令读取该全局变量的内存地址,通常该全局变量的内存地址值存放在程序的数据缓冲池中(LiteralPool)。根据该数据的类型,使用相应的LDR指令读取该全局变量的值;使用相应的STR指令修改该全局变量的值。1618.2从汇编程序中访问从汇编程序中访问C程序变量程序变量各数据各数据类型及其型及其对应的的LDR/STR指令如下:指令如下:对于无符号的char类型的变量,通过指令LDRB/STRB来读/写。对于无符号的short类型的变量,通过指令LDRH/STRH来

133、读/写。对于int类型的变量,通过指令LDR/STR来读/写。对于有符号的char类型的变量,通过指令LDRSB来读取。对于有符号的char类型的变量,通过指令STRB来写入。对于有符号的short类型的变量,通过指令LDRSH来读取。对于有符号的short类型的变量,通过指令STRH来写入。对于小于8个字的结构型的变量,可以通过一条LDM/STM指令来读/写整个变量。对于结构型变量的数据成员,可以使用相应的LDR/STR指令来访问,这时必须知道该数据成员相对于结构型变量开始地址的偏移量。1628.3汇编程序、汇编程序、C程序以及程序以及C+程序的相互调用程序的相互调用本本节介介绍汇编程序、程

134、序、C程序以及程序以及C+程序的相程序的相互互调用技用技术。1638.3.1在在C+程序中使用程序中使用C程序头文件程序头文件可以在可以在C+程序中使用程序中使用C程序的程序的头文件,文件,这时候候C程程序的序的头文件要包含在文件要包含在伪操作操作extern“C”中,例如中,例如extern“C”include“cheader.h”。具体。具体规则分以分以下两种情况:下两种情况:在C+程序中使用C程序的系统头文件。在C+程序中使用C程序的用户定义头文件。1648.3.2汇编程序、汇编程序、C程序以及程序以及C+程序的相互调用举例程序的相互调用举例1.C程序程序调用用汇编程序程序程序8.5C语

135、言调用汇编程序2.汇编程序程序调用用C程序程序程序8.6汇编程序调用C程序3.C+程序程序调用用C程序程序程序8.7C+程序调用C程序4.汇编程序程序调用用C+程序程序程序8.8汇编程序调用C+程序165第第9章章异常中断处理异常中断处理在在ARM体系中,通常有以下体系中,通常有以下3种方式来控制程序的种方式来控制程序的执行流程:行流程:在正常程序执行过程中,每执行一条ARM指令,程序计数器(PC)的值加4个字节;每执行一条Thumb指令,程序计数器(PC)的值加两个字节。整个过程是顺序执行的。通过跳转指令,程序可以跳转到特定的地址标号处执行,或者跳转到特定的子程序处执行。当异常中断发生时,系

136、统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。1679.1.1ARM体系中的异常中断种类体系中的异常中断种类ARM体系中的异常中断如表体系中的异常中断如表9.1所示。所示。1689.1.1ARM体系中的异常中断种类体系中的异常中断种类1699.1.2异常中断向量表及异常中断优先级异常中断向量表及异常中断优先级中断向量表中指定了各异常中断及其中断向量表中指定了各异常中断及其处理程序的理程序的对应关系。它通常存放在存关系。它通常存放在存储地址的低端。在地址的低端。在ARM体体系中,异常中断向量表的大小系中,异常中断向量表的大小为32字字节。每个异常中断每个异常中断对应的中断向量表中的的

137、中断向量表中的4个字个字节的空的空间中存放了一个跳中存放了一个跳转指令或者一个向程序指令或者一个向程序计数器数器(PC)中中赋值的数据的数据访问指令。通指令。通过这两种指令,程两种指令,程序将跳序将跳转到相到相应的异常中断的异常中断处理程序理程序处执行。行。当几个异常中断同当几个异常中断同时发生生时,就必,就必须按照一定的次按照一定的次序来序来处理理这些异常中断。些异常中断。处理器理器执行某个特定的异常中断的行某个特定的异常中断的过程中,称程中,称为处理器理器处于特定的中断模式。于特定的中断模式。1709.1.2异常中断向量表及异常中断优先级异常中断向量表及异常中断优先级各异常中断的中断向量地

138、址以及中断的各异常中断的中断向量地址以及中断的处理理优先先级如表如表9.2所示。所示。171中断向量地址异常中断类型异常中断模式优先级(6最低)0x0复位特权模式(SVC)10x4未定义的指令未定义指令中止模式(Undef)60x8软件中断(SWI)特权模式(SVC)60x0c指令预取中止中止模式50x10数据访问中止中止模式20x14保留未使用未使用0x18外部中断请求(IRQ)外部中断(IRQ)模式40x1c快速中断请求(FIQ)快速(FIQ)中断模式39.1.3异常中断使用的寄存器异常中断使用的寄存器各异常中断各异常中断对应着一定的着一定的处理器模式。理器模式。应用程序通用程序通常运行在

139、用常运行在用户模式下。模式下。ARM中的中的处理器模式如表理器模式如表9.3所示。所示。172处理器模式描述用户模式(User,usr)正常程序执行的模式快速中断模式(FIQ,fiq)用于高速数据传输和通道处理外部中断模式(IRQ,irq)用于通常的中断处理特权模式(Supervisor,sve)供操作系统使用的一种保护模式中止模式(Abort,abt)用于虚拟存储及存储保护未定义指令模式(Undefined,und)用于支持通过软件仿真硬件的协处理器系统模式(System,sys)用于运行特权级的操作系统任务9.1.3异常中断使用的寄存器异常中断使用的寄存器各种不同的各种不同的处理器模式可能

140、有理器模式可能有对应于于该处理器模式理器模式的物理寄存器的物理寄存器组,如表,如表9.4所示。所示。1739.2进入和退出异常中断的过程进入和退出异常中断的过程本本节主要介主要介绍处理器理器对于各种异常中断的响于各种异常中断的响应过程以及从异常中断程以及从异常中断处理程序中返回的方法。理程序中返回的方法。对于不同的异常中断于不同的异常中断处理程序,返回地址以及理程序,返回地址以及使用的指令是不同的。使用的指令是不同的。1749.2.1ARM处理器对异常中断的响应过程处理器对异常中断的响应过程ARM处理器理器对异常中断的响异常中断的响应过程如下。程如下。(1)保存处理器当前状态、中断屏蔽位以及各

141、条件标志位。(2)设置当前程序状态寄存器CPSR中相应的位。(3)将寄存器lr_mode设置成返回地址。(4)将程序计数器值(PC)设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。1759.2.1ARM处理器对异常中断的响应过程处理器对异常中断的响应过程1.响响应复位异常中断复位异常中断2.响响应未定未定义指令异常中断指令异常中断3.响响应SWI异常中断异常中断4.响响应指令指令预取中止异常中断取中止异常中断5.响响应数据数据访问中止异常中断中止异常中断6.响响应IRQ异常中断异常中断7.响响应FIQ异常中断异常中断1769.2.2从异常中断处理程序中返回从异常中断处理

142、程序中返回从异常中断从异常中断处理程序中返回包括下面两个基本操作:理程序中返回包括下面两个基本操作:恢复被中断的程序的处理器状态,即把SPSR_mode寄存器内容复制到当前程序状态寄存器CPSR中。返回到发生异常中断的指令的下一条指令处执行,即把lr_mode寄存器的内容复制到程序计数器PC中。复位异常中断复位异常中断处理程序不需要返回。整个理程序不需要返回。整个应用系用系统是从复位异常中断是从复位异常中断处理程序开始理程序开始执行的,因而它不行的,因而它不需要返回。需要返回。1779.2.2从异常中断处理程序中返回从异常中断处理程序中返回1.SWI和未定和未定义指令异常中断指令异常中断处理程

143、序的返回理程序的返回2.IRQ和和FIQ异常中断异常中断处理程序的返回理程序的返回3.指令指令预取中止异常中断取中止异常中断处理程序的返回理程序的返回4.数据数据访问中止异常中断中止异常中断处理程序的返回理程序的返回1789.3在应用程序中安排异常中断处理程序在应用程序中安排异常中断处理程序通常有两种方法将异常中断通常有两种方法将异常中断处理程序注册到异常中理程序注册到异常中断向量表中。一种是使用跳断向量表中。一种是使用跳转指令,另一种是使用指令,另一种是使用数据数据读取指令取指令LDR。使用跳使用跳转指令的方法比指令的方法比较简单,可以在异常中断,可以在异常中断对应的向量表中的特定位置放一条

144、跳的向量表中的特定位置放一条跳转指令,直接跳指令,直接跳转到到该异常中断的异常中断的处理程序。理程序。这种方法有一个缺点,种方法有一个缺点,即跳即跳转指令只能在指令只能在32MB的空的空间范范围内跳内跳转。使用数据使用数据读取指令取指令LDR向程序向程序计数器数器PC中直接中直接赋值。这种方法分种方法分为两步:先将异常中断两步:先将异常中断处理程序的理程序的绝对地址存放在距离向量表地址存放在距离向量表4KB的范的范围之内的一个之内的一个存存储单元中;再使用数据元中;再使用数据读取指令取指令LDR将将该单元的元的内容内容读取到程序取到程序计数器数器PC中。中。1799.3.1在系统复位时安排异常

145、中断处理程序在系统复位时安排异常中断处理程序1.地址地址0x0处为ROM的情况的情况(1)使用数据读取指令LDR的示例(2)使用跳转指令的示例2.地址地址0x0处为RAM的情况的情况1809.3.2在在C程序中安排异常中断处理程序程序中安排异常中断处理程序1.中断向量表中使用跳中断向量表中使用跳转指令的情况指令的情况(1)读取中断处理程序的地址。(2)从上一步得到的地址中减去该异常中断对应的中断向量的地址。(3)从上一步得到的地址中减去8,以允许指令预取。(4)将上一步得到的地址右移2位,得到以字(32位)为单位的偏移量。(5)确保上一步得到的地址值高8位为0,因为跳转指令只允许24位的偏移量

146、。(6)将上一步得到的地址与数据0xea000000作逻辑或,从而得到将要写到中断向量表中的跳转指令的编码。1819.3.2在在C程序中安排异常中断处理程序程序中安排异常中断处理程序2.中断向量表中使用数据中断向量表中使用数据读取指令的情况取指令的情况(1)读取中断处理程序的地址。(2)从上一步得到的地址中减去该异常中断对应的中断向量的地址。(3)从上一步得到的地址中减去8,以允许指令预取。(4)将上一步得到的地址与数据0xe59ff000做逻辑或,从而得到将要写到中断向量表中的数据读取指令的编码。(5)将中断处理程序的地址放到相应的存储单元中。1829.4SWI异常中断处理程序异常中断处理程

147、序通通过SWI异常中断,用异常中断,用户模式的模式的应用程序可以用程序可以调用系用系统模式下的代模式下的代码。在。在实时操作系操作系统中,通常中,通常使用使用SWI异常中断异常中断为用用户应用程序提供系用程序提供系统功能功能调用。用。1839.4.1SWI异常中断处理程序的实现异常中断处理程序的实现1.第第1级SWI异常中断异常中断处理程序理程序2.使用使用汇编程序的第程序的第2级SWI异常中断异常中断处理程序理程序3.使用使用C程序的第程序的第2级SWI异常中断异常中断处理程序理程序1849.4.2SWI异常中断调用异常中断调用1.在特在特权模式下模式下调用用SWI2.从从应用程序中用程序中

148、调用用SWI3.从从应用程序中用程序中动态调用用SWI1859.5FIQ和和IRQ异常中断处理程序异常中断处理程序ARM提供的提供的FIQ和和IRQ异常中断用于外部异常中断用于外部设备向向CPU请求中断服求中断服务。这两个异常中断的引脚都是低两个异常中断的引脚都是低电平有效的。当前程序状平有效的。当前程序状态寄存器寄存器CPSR的的I控制位控制位可以屏蔽可以屏蔽这两个异常中断两个异常中断请求:当程序状求:当程序状态寄存器寄存器CPSR中的中的I控制位控制位为1时,FIQ和和IRQ异常中断被屏异常中断被屏蔽;当程序状蔽;当程序状态寄存器寄存器CPSR中的中的I控制位控制位为0时,CPU正常响正常

149、响应FIQ和和IRQ异常中断异常中断请求。求。FIQ异常中断异常中断为快速异常中断,它比快速异常中断,它比IRQ异常中断异常中断优先先级高,高,这主要表主要表现在如下两个方面:在如下两个方面:当FIQ和IRQ异常中断同时产生时,CPU先处理FIQ异常中断。在FIQ异常中断处理程序中,IRQ异常中断被禁止。1869.5.1IRQ/FIQ异常中断处理程序异常中断处理程序1.不可重入的不可重入的IRQ/FIQ异常中断异常中断处理程序理程序保存APCS规定的被破坏的寄存器。保存其他中断处理程序中用到的寄存器。同时将(LR4)赋予程序计数器PC,实现中断处理程序的返回,并且恢复CPSR寄存器的内容。2.

150、可重入的可重入的IRQ/FIQ异常中断异常中断处理程序理程序(1)将返回地址保存到IRQ的数据栈中。(2)保存工作寄存器和SPSR_irq。(3)清除中断标志位。(4)将处理器切换到系统模式,重新使能中断(IRQ/FIQ)。(5)保存用户模式的LR寄存器和被调用者不保存的寄存器。(6)调用C语言的IRQ/FIQ异常中断处理程序。(7)当C语言的IRQ/FIQ异常中断处理程序返回后,恢复用户模式的寄存器,并禁止中断(IRQ/FIQ)。(8)切换到IRQ模式,禁止中断。(9)恢复工作寄存器和寄存器LR_irq。(10)从IRQ异常中断处理程序中返回。1879.5.2IRQ异常中断处理程序举例异常中

151、断处理程序举例本例中有多达本例中有多达32个中断源,每个中断源个中断源,每个中断源对应一个一个单独的独的优先先级值,优先先级的取的取值范范围为031。假。假设系系统中的中断控制器的基地址中的中断控制器的基地址为IntBase,存放中,存放中断断优先先级值的寄存器的偏移地址的寄存器的偏移地址为IntLevel。寄存。寄存器器R13指向一个指向一个FD类型的数据型的数据栈。例子的源代。例子的源代码如如程序程序9.13中所示。中所示。程序程序9.13多中断源的多中断源的IRQ异常中断异常中断处理程序:理程序:参见教材P3011889.6复位异常中断处理程序复位异常中断处理程序复位异常中断复位异常中断

152、处理程序在系理程序在系统加加电或复位或复位时执行,行,它将它将进行一些初始化工作,具体内容与具体系行一些初始化工作,具体内容与具体系统相相关,然后程序控制关,然后程序控制权交交给应用程序,因而复位异常用程序,因而复位异常中断中断处理程序不需要返回。下面是通常在复位异常理程序不需要返回。下面是通常在复位异常中断中断处理程序中理程序中进行的一些行的一些处理:理:设置异常中断向量表。初始化数据栈和寄存器。初始化存储系统,如系统中的MMU等(如果系统中包含这些部件的话)。初始化一些关键的I/O设备。使用中断。将处理器切换到合适的模式。初始化C语言环境变量,跳转到应用程序执行。1899.7未定义指令异常

153、中断未定义指令异常中断这种仿真的种仿真的处理理过程程类似于似于SWI异常中断的功能异常中断的功能调用。在用。在SWI异常中断的功能异常中断的功能调用中通用中通过读取取SWI指指令中的令中的24位位(位位23:0)立即数,判断具体立即数,判断具体请求的求的SWI功能。功能。这种仿真机制的操作种仿真机制的操作过程如下。程如下。(1)将仿真程序设置成未定义指令异常中断的中断处理程序(链接到未定义指令异常中断的中断处理程序链中),并保存原来的中断处理程序。(2)读取该未定义指令的位27:24,判断该未定义指令是否是一个协处理器指令。(3)如果不仿真该未定义指令,则程序跳转到原来的未定义指令异常中断的中

154、断处理程序中执行。Thumb指令集中不包含协处理器指令,因而不需要这种指令仿真机制。1909.8指令预取中止异常中断处理程序指令预取中止异常中断处理程序如果系如果系统中不包含中不包含MMU,指令,指令预取中止异常中断取中止异常中断处理程序只是理程序只是简单地地报告告错误,然后退出。如果系,然后退出。如果系统中包含中包含MMU,则发生生错误的指令触的指令触发虚虚拟地址失效,地址失效,在在该失效失效处理程序中重新理程序中重新读取取该指令。指令指令。指令预取中取中止异常中断是由止异常中断是由错误的指令的指令执行行时被触被触发的,的,这时LR_abt寄存器寄存器还没有被更新,它指向没有被更新,它指向该

155、指令的下面指令的下面一条指令。因一条指令。因为该有有问题的指令要被重新的指令要被重新读取,因取,因而而应该返回到返回到该有有问题的指令,即返回到的指令,即返回到(LR_abt-4)处。1919.9数据访问中止异常中断处理程序数据访问中止异常中断处理程序如果系如果系统中不包含中不包含MMU,数据,数据访问中止异常中断中止异常中断处理程序只是理程序只是简单地地报告告错误,然后退出。如果系,然后退出。如果系统中包含中包含MMU,数据,数据访问中止异常中断中止异常中断处理程序要理程序要处理理该数据数据访问中止。当中止。当发生数据生数据访问中止异常中断中止异常中断时,LR_abt寄存器已寄存器已经被更新

156、,它指向引起数据被更新,它指向引起数据访问中止异常中断的指令后面的第中止异常中断的指令后面的第2条指令,此条指令,此时要要返回到引起数据返回到引起数据访问中止异常中断的指令,即中止异常中断的指令,即(LR_abt-8)处。下面下面3种情况可能引起数据种情况可能引起数据访问中止异常中断。中止异常中断。1.LDR/STR指令2.SWAP指令3.LDM/STM指令192第第10章章ARMC/C+编译器编译器10.1ARMC/C+编译器概述器概述本节介绍编译ARM程序时的一些基本概念。ARM编译器的具体使用方法将在10.2节介绍。19410.1.1ARMC/C+编译器及语言库介绍编译器及语言库介绍AR

157、M集成开集成开发环境中包含的境中包含的C/C+编译器如表器如表10.1中所示。中所示。195编译器名称编译器种类源文件类型源文件后缀输出的目标文件类型armccCC.C32位ARM代码tccCC.C16位Thumb代码armcppC+C/C+.C/.CPP32位ARM代码tcppC+C/C+.C/.CPP16位Thumb代码10.1.1ARMC/C+编译器及语言库介绍编译器及语言库介绍ARM集成开集成开发环境中境中C/C+语言的言的库包括下面几种:包括下面几种:ARMC语言库RogueWaveC+库支持库ARM中中C/C+语言言库是以二是以二进制的形式提供的。制的形式提供的。对应于不同的于不同

158、的ATPCS格式,有相格式,有相应格式的格式的C/C+语言言库,这是通是通过不同的不同的编译器器选项指定的。指定的。19610.1.2ARM编译器中与搜索路径相关的一些基本概念编译器中与搜索路径相关的一些基本概念下面下面这些因素可以影响些因素可以影响ARM编译器如何去搜索器如何去搜索头文文件和源文件:件和源文件:编译时指定的I选项和J选项。编译时指定的fk选项和fd选项。环境变量ARMINC的值。文件名称是基于绝对路径的还是基于相对路径的。文件名是用双引号包括的还是用尖括号包括的。19710.1.2ARM编译器中与搜索路径相关的一些基本概念编译器中与搜索路径相关的一些基本概念1.内存中的文件系

159、内存中的文件系统2.当前位置当前位置3.ARMINC环境境变量量4.编译时的搜索路径的搜索路径19810.2ARM编译器命令行格式编译器命令行格式本本节描述的描述的编译器的器的选项适用于适用于ARM集成开集成开发环境境中所有的中所有的编译器。器。对于特定的于特定的编译器有效的器有效的编译器器选项,在介,在介绍时会特会特别指出。指出。ARM编译器命令行格式如下所示:器命令行格式如下所示:compilerPCSoptionssourcelanguagesearchpathspreprocessoroptionsoutputformattargetoptionsdebugoptionscodegen

160、erationoptionswarningoptionsadditionalcheckserroroptionssource19910.2.1过程调用标准过程调用标准可以通可以通过编译选项-apcs来指定使用的来指定使用的过程程调用用标准。其格式如下所示:准。其格式如下所示:apcsqualifiers其中,其中,qualifiers指定使用的指定使用的过程程调用用标准。准。这里必里必须满足两个条件:足两个条件:至少必至少必须指定一个指定一个qualifier;如果指定多个;如果指定多个qualifier,各,各qualifier之之间不能有空格。不能有空格。当没有使用当没有使用-apcs选项

161、时,编译器默器默认的的过程程调用用标准如下所示:准如下所示:apcs/noswst/nointer/noropi/norwpifpusoftvfp当使用当使用选项-cpu时,指定的,指定的值可能会使默可能会使默认的的-fpu选项失效。失效。各种各种qualifiers的含的含义及用法如下所示。及用法如下所示。1.与interwork相关的qualifiers2.与位置无关特性相关的qualifiers3.与数据栈检查相关的qualifiers20010.2.2设置源程序语言类型设置源程序语言类型下面的下面的这些些编译选项用于指定用于指定编译器可以器可以处理的理的语言言类型。默型。默认情况下,情

162、况下,ARMC编译器器处理理ANSIC标准的源程序,准的源程序,ARMC+编译器器处理理ISO/IECC+源程序。使用源程序。使用这些些选项可以指定源程序可以指定源程序应在多大程在多大程度上符合各种度上符合各种标准。准。ansiansiccppembeddedcplusplusstrict20110.2.2设置源程序语言类型设置源程序语言类型下面是下面是这些些选项的一些的一些应用用实例。例。armccansi:编译ANSI标准C语言源程序,这是默认的选项。armccstrict:编译严格遵循ANSI标准的C语言源程序。armcpp:编译标准C+源程序。armcppansi:编译ANSI标准C语

163、言源程序。armcppansistrict:编译严格遵循ANSI标准的C语言源程序。armcppstrict:编译严格遵循C+标准的源程序。20210.2.3指定搜索路径指定搜索路径下面的一些下面的一些选项用于指定用于指定编译器搜索器搜索头文件和源文文件和源文件件时的路径。的路径。这里介里介绍各各选项各自的含各自的含义,它,它们组合使用合使用时的的规则在表在表10.2中已中已经做做过说明。明。IdirnamefkfdJdirname20310.2.4设置预处理选项设置预处理选项下面的一些下面的一些选项用于用于设置置预处理理选项。ECDsymbol=valueDsymbolUsymbolM204

164、10.2.5设置输出文件的类型设置输出文件的类型下面的一些下面的一些选项可以控制可以控制编译器器输出的文件出的文件类型,型,它它们可以是生成的可以是生成的汇编程序列表文件,也可以是未程序列表文件,也可以是未进行行连接的目接的目标文件等。文件等。c(小写)listfifjfuofileMDdependfilenameSfs20510.2.6指定目标处理器和指定目标处理器和ARM体系版本体系版本在在编译源程序源程序时,可以指定特定的,可以指定特定的CPU型号或者型号或者ARM体系的版本号,体系的版本号,这样,编译器就可以利用特定器就可以利用特定的的处理器或理器或ARM体系的特性,生成性能更好的代体

165、系的特性,生成性能更好的代码。但是,但是,这种做法可能造成程序在其他种做法可能造成程序在其他ARM处理器上理器上不兼容。不兼容。ARM编译器包含下面两个器包含下面两个选项,用于指定目,用于指定目标处理理器或者器或者ARM体系的版本。体系的版本。选项cpuname:用于指定目标处理器和ARM体系的版本。选项fpu:用于指定系统中浮点运算部件的体系。20610.2.6指定目标处理器和指定目标处理器和ARM体系版本体系版本1.-cpuname的用法的用法2.-fpuname的用法的用法选项fpuname用于指定系统中浮点运算部件的体系。如果使用选项fpu,则选项cpuname隐含的浮点运算部件体系失

166、效。20710.2.7生成调试信息生成调试信息下面下面这些些选项指定指定编译器是否器是否产生生调试信息,如果信息,如果产生生调试信息,信息,则可以指定可以指定调试信息的格式。信息的格式。goptiong+ggtpdwarf220810.2.8代码生成的控制代码生成的控制本小本小节介介绍控制代控制代码生成的生成的编译选项。这些些选项主主要包括下面几要包括下面几类:控制代码优化的编译选项。设置非受限浮点常量的默认类型的编译选项。控制代码段和数据段的编译选项。设置内存模式(字节顺序)的编译选项。设置内存对齐模式的编译选项。其他一些编译选项。20910.2.8代码生成的控制代码生成的控制1.控制代控制

167、代码优化的化的编译选项(1)Onumber(2)Ospace(3)Otime(4)Oinline(5)Ono_inline(6)Oautoinline(7)Ono_autoinline(8)Oknown_library(9)Ono_known_library(10)Oldrd(11)Ono_ldrd(12)spit_ldm21010.2.8代码生成的控制代码生成的控制2.设置非受限的浮点常量的默置非受限的浮点常量的默认类型的型的编译选项3.控制代控制代码段和数据段的段和数据段的编译选项4.设置内存模式置内存模式(字字节顺序序)的的编译选项littleendbigend5.设置内存置内存对齐模式

168、的模式的编译选项zasNumbermemaccessoption6.其他一些其他一些编译选项fyzc21110.2.9控制警告信息的产生控制警告信息的产生编译器在器在检测到可能的到可能的错误时,将,将产生生报警信息。警信息。可以同可以同时指定特定的指定特定的编译选项让编译器不器不产生特定生特定的警告信息。但是,通常情况的警告信息。但是,通常情况应该检查程序,而不程序,而不是关是关闭这些警告信息。些警告信息。关关闭特定特定报警信息的警信息的编译选项的格式如下所示:的格式如下所示:Woptions+options其中,其中,+前的前的选项是将要被关是将要被关闭的警告信息;的警告信息;+后后的是被打

169、开的警告信息。下面的是被打开的警告信息。下面举例例说明本明本编译选项的使用方法:的使用方法:Wad+fg21210.2.10编译时进行的一些额外的检查编译时进行的一些额外的检查通通过指定下面的指定下面的选项,可以要求,可以要求编译器在器在编译时进行一些行一些额外的外的检查,这样做有利于保持程序有做有利于保持程序有良好的移植性。良好的移植性。fafhfpfvfx21310.2.11控制错误信息控制错误信息ARM编译器允器允许用用户关关闭某些可以恢复的某些可以恢复的错误,或者将某,或者将某些些错误类型型“降降级”,作,作为警告警告类型型处理。理。这种做法在将一种做法在将一些程序从其他些程序从其他环

170、境移植到境移植到ARM环境境时,会有一些帮助。但,会有一些帮助。但是,是,这种做法将使程序不符合种做法将使程序不符合ANSIC、ISOC+标准,而准,而且可能使程序不能正确且可能使程序不能正确执行。因此,一般情况下,行。因此,一般情况下,还是通是通过改正程序,而不是关改正程序,而不是关闭错误信息来完成程序。信息来完成程序。控制控制错误信息的信息的选项格式如下所示:格式如下所示:Eoptions+options其中,其中,+前的前的选项是将要被关是将要被关闭的的错误信息;信息;+后是被打开后是被打开的的错误信息。下面信息。下面举例例说明本明本编译选项的使用方法:的使用方法:Eac+fi21410

171、.3ARM编译器中的编译器中的pragmas在在ARM编译器中,器中,pragmas的格式如下所示:的格式如下所示:#pragmano_featurename其中,其中,#pragmafeature-name设置置feature-name,而,而#pragmano_feature-name取消取消feature-name。ARM编译器支持的各种器支持的各种pragmas如表如表10.5所示。所示。215pragmas名称默认状态含义check_printf_formatoff检查printf类函数中字符串的格式check_scanf_formatoff检查scanf类函数中字符串的格式chec

172、k_stackon检查数据栈是否溢出debugon是否产生调试信息表import引入外部符号ospace编译器对代码大小进行优化otime编译器对代码运行速度进行优化onum指定编译器的优化级别softfp_linkageoff是否使用软件浮点连接10.3ARM编译器中的编译器中的pragmas1.check_printf_format2.check_scanf_format3.debug4.ospace5.otime6.onum7.stack_check8.softfp_linkage9.import21610.4ARM编译器特定的关键词编译器特定的关键词ARM编译器支持一些器支持一些对AN

173、SIC进行行扩展的关展的关键词。这些关些关键词用于声明用于声明变量、声明函数、量、声明函数、对特定的数特定的数据据类型型进行一定的限制。行一定的限制。21710.4.1用于声明函数的关键词用于声明函数的关键词1._asm2._inline3._irq4._pure5._softfp6._swi7._swi_indirect8._value_in_regs9._weak21810.4.2用于声明变量的关键词用于声明变量的关键词1.register2._int643._global_reg(vreg)21910.4.3用于限定数据类型的关键词用于限定数据类型的关键词1._align(8)2._pa

174、cked(1)关键词_packed使被其限定的数据是1字节对齐的,即:_packed类型的对象不会插入任何“补丁”来实现字节对齐。_packed类型的对象使用非对齐的存储访问进行读写。(2)关键词_packed不能用于限定下面的数据类型:浮点类型。包含浮点类型的结构和联合。前面没有用_packed的结构。3._volatile4._weak22010.5ARM编译器支持的基本数据类型编译器支持的基本数据类型ARM编译器支持的基本数据器支持的基本数据类型如表型如表10.6所示。所示。221数据类型长度对齐特性Char81(字节对齐)Short162(半字对齐)Int324(字对齐)Long324

175、(字对齐)Longlong644(字对齐)Float324(字对齐)Double644(字对齐)Longdouble644(字对齐)Allpointers324(字对齐)Bool(C+only)324(字对齐)10.5ARM编译器支持的基本数据类型编译器支持的基本数据类型1.整数整数类型型2.浮点数浮点数3.指指针类型的数据型的数据22210.6ARM编译器中的预定义宏编译器中的预定义宏ARM编译器器预定定义了一些宏,有些了一些宏,有些预定定义宏宏对应一一定的数定的数值,有些,有些预定定义宏没有宏没有对应的数的数值。表。表10.7列出了列出了这些些预定定义宏及其有效的宏及其有效的场合。合。参见

176、教材P33722310.7ARM中的中的C/C+库库本本节介介绍ARMC/C+运行运行时库,这些些库为运行运行C/C+应用程序提供了各种支持。本用程序提供了各种支持。本节主要包括下主要包括下面面4部分内容:部分内容:ARM中C/C+库的基本概念。建立一个使用C/C+库的C/C+应用程序。建立一个不使用C/C+库的C/C+应用程序。裁减C/C+运行时库,以适应特定的目标运行环境。22410.7.1ARM中的中的C/C+运行时库概述运行时库概述1.ARM中的中的C/C+运行运行时库类型型2.ARM中中C/C+库的存放位置的存放位置3.ARMC/C+库的可重入性的可重入性4.使用使用ARMC/C+库

177、时应注意的事注意的事项22510.7.2建立一个包含建立一个包含C/C+运行时库的运行时库的C/C+应用程序应用程序C/C+应用程序可以使用用程序可以使用C/C+运行运行时库中的函数,中的函数,这时,C运行运行时库将会完成下面的功能。将会完成下面的功能。建立建立C/C+应用程序运行用程序运行环境,境,这包括:包括:建立数据栈。如果需要,建立数据堆。初始化需要使用的C/C+运行时库。运行程序main()。提供对ISOC标准规定的函数的支持。捕捉C/C+应用程序运行时产生的错误信息,并根据具体的实施规则进行相应的处理。C/C+应用程序使用用程序使用C/C+运行运行时库的方式有下面几种,本小的方式有

178、下面几种,本小节介介绍前前两种,两种,10.7.3小小节介介绍第第3种。种。(1)在semihost环境下使用C/C+运行时库。(2)在没有主机支持的环境下,如应用程序位于目标系统的ROM中,使用C/C+运行时库。(3)C/C+应用程序不使用main(),也不初始化C/C+运行时库。22610.7.2建立一个包含建立一个包含C/C+运行时库的运行时库的C/C+应用程序应用程序1.在在semihost环境下使用境下使用C/C+运行运行时库2.在在nonsemihosted环境下使用境下使用C/C+运行运行时库22710.7.3建立不包含建立不包含C运行时库的应用程序运行时库的应用程序当当应用程序

179、中包含了函数用程序中包含了函数main()时,将会引起,将会引起对C运行运行时库的初始化。如果的初始化。如果应用程序中不包含函数用程序中不包含函数main(),将不会引起,将不会引起对C运行运行时库的初始化。的初始化。这时,C运运行行时库的很多功能在的很多功能在应用程序中是不能使用的。本用程序中是不能使用的。本小小节将将这种不使用种不使用C运行运行时库的的C/C+应用程序称用程序称为裸机裸机C程序。裸机程序。裸机C程序不能使用下面的功能:程序不能使用下面的功能:软件的数据栈溢出检查。低级标准输入/输出stdio。signal.h中定义的函数signal()及raise()。atexit()。a

180、lloca()。22810.7.3建立不包含建立不包含C运行时库的应用程序运行时库的应用程序1.C运行运行时库中的一些支持函数的使用中的一些支持函数的使用2.裸机裸机C程序程序重新实现_rt_raise(),该函数被程序中的错误处理代码使用。不要定义函数main()。在编译选项中不要使用软件的数据栈溢出检查选项。编写一个汇编指令的代码段(veneer),设置相关的寄存器,为运行C程序做好必要的准备。保证自己编写的用于初始化的代码段得到运行。比如,可以将其放置到复位异常中断的中断处理程序中。编译程序时,使用编译选项fpunone。3.支持浮点操作的裸机支持浮点操作的裸机C程序程序4.使用使用C运

181、行运行时库中的函数中的函数22910.7.4裁减裁减C/C+运行时库以适应特定的目标运行环境运行时库以适应特定的目标运行环境1.C/C+应用程序初始化用程序初始化C/C+运行运行时库的的过程程将非固定(Nonroot)的执行代码域(Region)从装载地址空间复制到运行地址空间。将ZI域置零。跳转到_rt_entry()运行。2.C/C+应用程序的退出用程序的退出过程程应用程序可以在正常运行结束后从main()函数中退出,也可以因为错误原因在程序运行中退出。230第第11章章ARM连接器连接器11.1ARM映像文件映像文件ARM中的各种源文件(包括汇编程序、C语言程序以及C+程序)经过ARM编

182、译器编译后,生成ELF格式的目标文件。这些目标文件和相应的C/C+运行时库经过ARM连接器处理后,生成ELF格式的映像文件(Image)。这种ELF格式的映像文件可以被写入嵌入式设备的ROM中。本节介绍这种ELF格式的映像文件的结构。23211.1.1ARM映像文件的组成映像文件的组成1.ARM映像文件的映像文件的组成部分成部分一个映像文件由一个或多个域组成。每个域包含一个或多个输出段。每个输出段包含一个或多个输入段。各输入段包含了目标文件中的代码和数据。23311.1.1ARM映像文件的组成映像文件的组成2.ARM映像文件各映像文件各组成部分的地址映射成部分的地址映射ARM映像文件各组成部分

183、在存储系统中的地址有两种:一种是在映像文件位于存储器中时(也就是该映像文件开始运行之前)的地址,称为加载时地址;一种是在映像文件运行时的地址,称为运行时地址。在图11.2给出的例子中,RW段的加载时地址为0x6000(指该段所占的存储区域的起始地址),该地址位于ROM中;RW段的运行时地址为0x8000(指该段所占的存储区域的起始地址),该地址位于RAM中。23411.1.2ARM映像文件的入口点映像文件的入口点1.ARM映像文件中的两映像文件中的两类入口点入口点2.定定义初始入口点初始入口点3.普通入口点的用法普通入口点的用法23511.1.3输入段的排序规则输入段的排序规则通常情况下,一个

184、通常情况下,一个输出段中,各出段中,各输入段的排列入段的排列顺序序是由下面几个因素决定的。用是由下面几个因素决定的。用户也可以通也可以通过连接接选项-first和和-last来改来改变这些些规则。输入段的属性。输入段的名称。各输入段在连接命令行的输入段列表中的排列顺序。按照按照输入段的属性,其排列入段的属性,其排列顺序如下所示。序如下所示。(1)只读的代码段。(2)只读的数据段。(3)可读写的代码段。(4)其他已经初始化的数据段。(5)未初始化的数据。23611.2ARM连接器介绍连接器介绍ARM开开发包中包含了包中包含了连接器接器armlink,它将,它将编译得得到的到的ELF格式的目格式的

185、目标文件以及相关的文件以及相关的C/C+运行运行时库进行行连接,生成相接,生成相应的的结果文件。果文件。具体来具体来说,armlink可以完成以下操作:可以完成以下操作:连接编译后得到的目标文件和相应的C/C+运行时库,生成可执行的映像文件。将一些目标文件进行连接,生成一个新的目标文件,供将来进一步连接时使用,这称为部分连接。指定代码和数据在内存中的位置。生成被连接文件的调试信息和相互间的引用信息。23711.2ARM连接器介绍连接器介绍armlink在在进行部分行部分连接和完全接和完全连接生成可接生成可执行的映像文件行的映像文件时所所进行的行的操作是不同的。下面分操作是不同的。下面分别介介绍

186、这两种情况。两种情况。(1)armlink在进行完全连接生成可执行的映像文件时执行下面的操作。解析输入的目标文件之间的符号引用关系。根据输入目标文件对C/C+函数的调用关系,从C/C+运行时库中提取相应的模块。将各输入段排序,组成相应的输出段。删除重复的调试信息段。根据用户指定的分组和定位信息,建立映像文件的地址映射关系。重定位需要重定位的值。生成可执行的映像文件。(2)armlink在进行部分连接生成新的目标文件时执行下面的操作。删除重复的调试信息段。最小化符号表的大小。保留那些未被解析的符号。生成新的目标文件。23811.3ARM连接器生成的符号连接器生成的符号ARM连接器定接器定义了一些

187、符号,了一些符号,这些符号中都包含字符些符号中都包含字符$。ARM连接器在生成映像文件接器在生成映像文件时,用它,用它们来代表映像文件中来代表映像文件中各域的起始地址以及存各域的起始地址以及存储区域界限、各区域界限、各输出段的起始地址以出段的起始地址以及存及存储区域界限、各区域界限、各输入段的起始地址以及存入段的起始地址以及存储区域界限。区域界限。比如,比如,Load$region_name$Base代表域代表域region_name加加载时的起始地址;而的起始地址;而image$region_name$Base代表代表域域region_name运行运行时的起始地址。的起始地址。这些符号可以被

188、些符号可以被汇编程序引用,用于地址重定位。程序引用,用于地址重定位。这些符号些符号可以被可以被C程序作程序作为外部符号引用。外部符号引用。所有所有这些符号,只有在其被些符号,只有在其被应用程序引用用程序引用时,ARM连接器接器才会生成才会生成该符号。符号。推荐使用映像文件中与域相关的符号,而不是使用与段相关推荐使用映像文件中与域相关的符号,而不是使用与段相关的符号。的符号。23911.3.1连接器生成的与域相关的符号连接器生成的与域相关的符号连接器生成的与域相关的符号如表接器生成的与域相关的符号如表11.1所示。各符号的命名所示。各符号的命名规则是:如果使用了地址映射配置文件是:如果使用了地址

189、映射配置文件(scatter文件文件),该文文件件规定了映像文件中各域的名称;如果未使用地址映射配置定了映像文件中各域的名称;如果未使用地址映射配置文件文件(scatter文件文件),连接器按照下面的接器按照下面的规则确定各符号中的确定各符号中的region_name:对于只读的域,使用名称ER_RO。对于可读写的域,使用名称ER_RW。对于使用0初始化的域,使用名称ER_ZI。240符号名称含义Load$region_name$Base域region_name的加载时起始地址Image$region_name$Base域region_name的运行时起始地址Image$region_name

190、$Length域region_name运行时的长度(为4字节的倍数)Image$region_name$Limit域region_name运行时存储区域末尾的下一个字节地址(该地址不属于域region_name所占的存储区域)11.3.1连接器生成的与域相关的符号连接器生成的与域相关的符号对于映像文件的每个域,如果其中包含了于映像文件的每个域,如果其中包含了ZI属性的属性的输出段,出段,连接器将会接器将会为该ZI输出段生成另外的符号。出段生成另外的符号。这些符号如表些符号如表11.2所示。所示。241符号名称含义Image$region_name$ZI$Base域region_name中ZI输

191、出段的运行时起始地址Image$region_name$ZI$Length域region_name中ZI输出段运行时的长度(为4字节的倍数)Image$region_name$ZI$Limit域region_name中ZI输出段运行时存储区域末尾的下一个字节地址(该地址不属于域region_name所占的存储区域)11.3.2连接器生成的与输出段相关的符号连接器生成的与输出段相关的符号如果未使用地址映射配置文件如果未使用地址映射配置文件(scatter文件文件),连接接器生成的与器生成的与输出段相关的符号如出段相关的符号如表表11.3所示;如所示;如果使用了地址映射配置文件果使用了地址映射配置

192、文件(scatter文件文件),表,表11.3中所列的符号没有意中所列的符号没有意义,如果,如果应用程序使用了用程序使用了这些些符号,将可能得到符号,将可能得到错误的的结果,果,这时应该使用上一使用上一小小节中介中介绍的与域相关的符号。的与域相关的符号。242符号名称含义Image$RO$BaseRO输出段运行时的起始地址Image$RO$LimitRO输出段运行时存储区域的界限Image$RW$BaseRW输出段运行时的起始地址Image$RW$LimitRW输出段运行时的存储区域界限Image$ZI$BaseZI输出段运行时的起始地址Image$ZI$LimitZI输出段运行时存储区域的界

193、限11.3.3连接器生成的与输入段相关的符号连接器生成的与输入段相关的符号ARM连接器接器为映像文件中的每一个映像文件中的每一个输入段生成两个入段生成两个符号,如表符号,如表11.4所示。所示。243符号名称含义SectionName$BaseSectionName输入段运行时的起始地址SectionName$LimitSectionName输入段运行时的存储区域界限11.4连接器的优化功能连接器的优化功能1.删除重复的除重复的调试信息段信息段2.删除重复的代除重复的代码段段3.删除未使用的段除未使用的段4.生成小代生成小代码段段(veneer)24411.5运行时库的使用运行时库的使用ARM

194、连接器使用接器使用C/C+运行运行时库的基本步的基本步骤如下。如下。(1)ARM连接器根据一定的规则确定需要使用哪些C/C+运行时库。具体的规则在11.5.1小节中介绍。(2)从各搜索路径中查找相应的C/C+运行时库。参见11.5.2小节中的介绍。(3)选择合适种类的C/C+运行时库。适应于不同的编译选项和连接选项,各C/C+运行时库具有不同的种类。参见11.5.3小节中的介绍。(4)重复扫描各C/C+运行时库,解析各符号。参见11.5.4小节中的介绍。24511.5.1C/C+运行时库与目标文件运行时库与目标文件ARM中中C/C+运行运行时库就是一些就是一些ELF格式的目格式的目标文件的集合

195、,文件的集合,这些目些目标文件是按照文件是按照ar格式格式组织在一起的。在一起的。ARM连接器在使用一般目接器在使用一般目标文件和文件和C/C+运行运行时库时有所不同。其主要区有所不同。其主要区别如下所示。如下所示。(1)在ARM连接器的输入列表中的所有目标文件将被无条件地包含到输出的映像文件中,而不论该目标文件是否被其他的目标文件引用。如果用户在连接时没有指定连接选项noremove,连接器将会在后面的处理中删除映像文件中没有被使用的段。(2)而连接器在使用C/C+运行时库时,有所不同,主要遵守下面的规则:如果在连接器的输入列表中显式地指定了C/C+运行时库的某成员,则该成员将被无条件地包含

196、到输出的映像文件中,而不论该成员是否被其他的目标文件引用。如果C/C+运行时库中某成员被其他的目标文件按nonweak方式引用,或者被其他已经被包含的C/C+运行时库中的成员按nonweak方式引用,则该C/C+运行时库中的成员将会被包含到输出的映像文件中。被按weak方式引用的C/C+运行时库中的成员不会被包含到输出的映像文件中。24611.5.2查找需要的查找需要的C/C+运行时库运行时库可以通可以通过下面下面3种方法来指定种方法来指定ARM标准准C/C+运行运行时库的路径。其中的路径。其中连接接选项-libpath指定的指定的ARM标准准C/C+运行运行时库的路径的路径优先先级高于使用高

197、于使用环境境变量量ARMLIB指定的指定的ARM标准准C/C+运行运行时库的路径。的路径。使用连接选项libpath来指定ARM标准C/C+运行时库的路径。这时指定的是包含路径armlib和cpplib的父路径。使用CodeWarriorIDE中关于连接选项的控制面板来指定ARM标准C/C+运行时库的路径。使用环境变量ARMLIB来指定ARM标准C/C+运行时库的路径。这时ARMLIB被设置成包含路径armlib和cpplib的父路径。24711.5.3选择合适种类的选择合适种类的C/C+运行时库运行时库针对不同的不同的编译选项和和连接接选项,各,各C/C+运行运行时库具有不同的种具有不同的种

198、类。各种不同种。各种不同种类的的C/C+运行运行时库是依靠其名称来是依靠其名称来识别的。的。C/C+运行运行时库的命名的命名格式如下所示:格式如下所示:root_.24811.5.4扫描扫描C/C+运行时库运行时库在从上面的操作中得到需要使用的在从上面的操作中得到需要使用的C/C+运行运行时库,ARM连接器接器扫描描这些些C/C+运行运行时库,加,加载相相应的的对象,解析各象,解析各目目标文件中的符号。具体操作步文件中的符号。具体操作步骤如下。如下。(1)ARM连接器按顺序扫描各C/C+运行时库,以完成所有的nonweak方式的引用关系。这样,如果有多个目标可以满足引用关系,则排在前面的库被使

199、用。这是一个必须注意的特点。(2)如果某个库的成员满足引用要求,该成员被加载,从而解析了相应的符号。该成员函数的引入也可能实现了weak方式的引用。(3)在引入某个成员后,在解析了一些符号同时,可能带来新的需要解析的符号。(4)这种解析过程重复进行,直到解析完所有的符号,或者确定某些符号不能被解析为止。24911.6从一个映像文件中使用另一个映像文件中的符号从一个映像文件中使用另一个映像文件中的符号在在ARM中,从一个映像文件中中,从一个映像文件中访问另一个映像文件另一个映像文件中的符号是通中的符号是通过symdefs文件文件实现的。本的。本节介介绍这些相关的技些相关的技术。25011.6.1

200、symdefs文件文件symdefs文件是一种目文件是一种目标文件。与普通的目文件。与普通的目标文件文件不同的是,其中只包含了符号和其不同的是,其中只包含了符号和其对应的数的数值,没,没有包含代有包含代码和数据。一个和数据。一个symdefs文件通常包括文件通常包括3部分:一个部分:一个标识符;可符;可选的注的注释部分;包含符号和部分;包含符号和其其对应的数的数值的部分。下面是一个的部分。下面是一个symdefs文件的文件的简单例子。它包括了一个例子。它包括了一个symdefs文件通常包含的文件通常包含的3部分。部分。标识符:符:#注注释:;valuetypename,thisisanadde

201、dcomment25111.6.1symdefs文件文件1.标识符字符串符字符串2.注注释3.符号及其符号及其对应的的值(1)符号的地址值:ARM连接器使用固定的十六进制值来表示符号的地址值。用户在修改该地址值时可以使用十六进制,也可以使用十进制。(2)符号的类型:它有下面3类。A:ARM代码符号。T:Thumb代码符号。D:数据符号。(3)符号名称:满足ARM中关于合法符号的定义。25211.6.2建立建立symdefs文件文件在完成所有的其他在完成所有的其他连接操作后,接操作后,ARM连接器可以生接器可以生成一个成一个symdefs文件。文件。对于部分于部分连接和失接和失败的的连接接操作,

202、操作,ARM连接器不会接器不会产生生symdefs文件。文件。使用使用连接接选项-symdefsfilename生成相生成相应的的symdefs文件文件时,可以有下面两种情况:,可以有下面两种情况:如果连接选项中指定的文件filename不存在,在ARM连接器生成包括所有全局符号的symdefs文件。如果连接选项中指定的文件filename已存在,则该文件的内容将限制ARM连接器生成的symdefs文件中包括哪些符号。25311.6.3symdefs文件的使用文件的使用使用使用symdefs文件的方法与使用普通的目文件的方法与使用普通的目标文件相文件相同,将其作同,将其作为输入文件。入文件。A

203、RM连接器从接器从symdefs文文件中提取需要的符号及其相关信息,将件中提取需要的符号及其相关信息,将这些信息加些信息加入到入到输出符号表中,出符号表中,这些符号具有些符号具有ABSOLUTE和和GLOBAL属性。属性。ARM连接器像接器像对待从其他目待从其他目标文文件中提取的符号一件中提取的符号一样对待待这些符号。些符号。在从在从symdefs文件中提取符号及其相关信息文件中提取符号及其相关信息时,在,在下列情况下,下列情况下,ARM连接器接器认为该符号符号为非法符号,非法符号,将将产生生错误信息:信息:该符号的某一列信息为空时。该符号的某一列具有非法的数值时。25411.7隐藏或者重命名

204、全局符号隐藏或者重命名全局符号本本节介介绍如何将如何将输出文件中的符号出文件中的符号隐藏或者重命名。藏或者重命名。这样可以避免全局符号名称冲突。可以避免全局符号名称冲突。ARM提供的提供的steering格式的文件就是用于格式的文件就是用于这一目的。一目的。25511.7.1steering文件的格式文件的格式steering文件是一个文本文件,其格式如下:文件是一个文本文件,其格式如下:第1个非空格字符为字符“#”或者“;”的行是注释行,注释行是被作为空行来对待的。其中可以包含空行,以提高可读性。空行将被ARM连接器忽略。既非空行,也非注释行的行,可以是一个完整的命令,也可以是一个命令的一部

205、分,因为一个命令可以跨多个行。一个命令行的最后一个非空格字符如果为字符“,”,表示下面的一行是本命令的续行部分。25611.7.2steering文件中的命令文件中的命令1.RENAME2.HIDE3.SHOW25711.8ARM连接器的命令行选项连接器的命令行选项ARM连接器的命令行格式如下所示:接器的命令行格式如下所示:armlinkhelpvsnpartialoutputfileelfrobaseaddressropirwbaseaddressrwpisplitscatterfiledebug|nodebugremove(RO/RW/ZI)|unremoveentrylocationke

206、epsectionidfirstsectionidlastsectionidlibpathpathlistscanlib|noscanliblocals|nolocalscallgraphinfotopicsmapsymbolssymdefsfileeditfilexrefxreffromobject(section)xreftoobject(section)errorsfilelistfileverboseunmangled|mangledviafilestrictunresolvedsymbolinputfilelist25811.8ARM连接器的命令行选项连接器的命令行选项其中其中选项的

207、含的含义及用法如下所示。及用法如下所示。1.help2.vsn3.partial4.outputfile5.elf6.robaseaddress7.ropi8.rwbaseaddress9.rwpi10.split11.scatterfile12.debug25911.8ARM连接器的命令行选项连接器的命令行选项13.nodebug14.remove(RW/RO/ZI)15.unremove16.entrylocation17.keepsectionid18.firstsectionid19.lastsectionid20.libpathpathlist21.scanlib22.noscanl

208、ib23.locals24.nolocals26011.8ARM连接器的命令行选项连接器的命令行选项25.callgraph26.infotopics27.map28.symbols29.symdefsfile30.editfile31.xref32.xreffromobject(section)33.xreftoobject(section)34.errorsfile26111.8ARM连接器的命令行选项连接器的命令行选项35.listfile36.verbose37.unmangled38.mangled39.viafile40.strict41.unresolvedsymbol42.in

209、putfilelist26211.9使用使用scatter文件定义映像文件的地址映射文件定义映像文件的地址映射根据映像文件中地址映射的复根据映像文件中地址映射的复杂程度,有两种方法来告程度,有两种方法来告诉ARM连接器接器这些相关的信息。些相关的信息。对于映像文件中地址映射关系比于映像文件中地址映射关系比较简单的情况,可以使的情况,可以使用命令行用命令行选项;对于映像文件中地址映射关系比于映像文件中地址映射关系比较复复杂的情况,可以使的情况,可以使用一个配置文件。用一个配置文件。当映像文件中包含最多两个域,每个域中可以最多有当映像文件中包含最多两个域,每个域中可以最多有3个个输出段出段时,可,

210、可以使用如下的以使用如下的连接器接器连接接选项告告诉连接器相关的地址映射关系:接器相关的地址映射关系:ropirwpiro_baserw_basesplit当映像文件中地址映射关系更复当映像文件中地址映射关系更复杂时,可以使用一个配置文件告,可以使用一个配置文件告诉连接接器相关的地址映射关系。器相关的地址映射关系。这可以通可以通过下面的下面的连接接选项来来实现。关于配置。关于配置文件格式,在后面有文件格式,在后面有详细的介的介绍。scatterfilename26311.9.1scatter文件概述文件概述scatter文件是一个文本文件,它可以用来描述文件是一个文本文件,它可以用来描述ARM

211、连接器生成映像文件接器生成映像文件时需要的信息。具体来需要的信息。具体来说,在在scatter文件中可以指定下列信息:文件中可以指定下列信息:各个加载时域(LoadRegion)的加载时起始地址(LoadAddress)和最大尺寸。各个加载时域的属性。从每个加载时域中分割出的运行时域。各个运行时域的运行时起始地址(ExcutionAddress)和最大尺寸。各个运行时域的存储访问特性。各个运行时域的属性。各个运行时域中包含的输入段。26411.9.2scatter文件中各部分的介绍文件中各部分的介绍1.加加载时域的描述域的描述2.运行运行时域的描述域的描述3.输入段描述入段描述4.输入段入段选

212、择符符26511.9.3scatter文件使用举例文件使用举例1.一个加一个加载时域和域和3个个连续的运行的运行时域域2.一个加一个加载时域和域和3个不个不连续的运行的运行时域域3.两个加两个加载时域和域和3个不个不连续的运行的运行时域域4.固定运行固定运行时域域5.使用使用FIXED属性将某个域放置在属性将某个域放置在ROM中的固定位中的固定位置置6.一个接近一个接近实际系系统的例子的例子266第第12章章嵌入式应用程序示例嵌入式应用程序示例在本章中,介在本章中,介绍嵌入式嵌入式应用程序的用程序的设计方法。首先介方法。首先介绍嵌入嵌入式式应用程序用程序设计的基本知的基本知识。然后通。然后通过

213、几个示例,具体几个示例,具体说明明嵌入式嵌入式应用程序的用程序的设计方法。方法。对于每个示例,不于每个示例,不仅详细介介绍程序程序设计的要点,而且介的要点,而且介绍如何使用如何使用ARM开开发工具工具编译和和连接接这些程序,生成映像文件。本章是些程序,生成映像文件。本章是对前面几章知前面几章知识的的综合合应用。用。12.2、12.3和和12.4节中的示例是以中的示例是以ARM公司的公司的PID为目目标系系统的。的。12.5节中的示例是以中的示例是以LinkUp公司的公司的L7210SDB评价价板板为目目标系系统的。由于各种嵌入式的。由于各种嵌入式应用用环境相差非常大,因境相差非常大,因此,此,

214、这里主要是通里主要是通过这些示例来更直接地介些示例来更直接地介绍嵌入式嵌入式应用系用系统的开的开发方法,具体的代方法,具体的代码会因嵌入式会因嵌入式环境的不同而有差异。境的不同而有差异。26812.1嵌入式应用程序设计的基本知识嵌入式应用程序设计的基本知识本本节介介绍嵌入式嵌入式应用程序用程序设计的基本知的基本知识,比,比较详细地介地介绍系系统初始化初始化时要要进行的操作。在后面几行的操作。在后面几节的例子中,的例子中,还会会详细介介绍其中的一些技其中的一些技术。26912.1.1嵌入式应用系统中的存储映射嵌入式应用系统中的存储映射1.地址地址0x0处为ROM2.地址地址0x0处为RAM如果在

215、系统正常运行过程中,地址0x0处为RAM,则在系统复位时需要执行下面的操作序列。(1) 系统复位时,ROM被映射到地址0x0处,程序从这里获取复位异常中断的中断向量。(2) 执行复位异常中断向量,这里使用的是高位中断向量表。假设系统中ROM地址从0X0f000000开始,可以通过下面的伪指令跳转到存放在ROM中的下一条指令处执行:LDRPC,=0x0f000004(3) 设置地址重映射寄存器REMAP=1,重新将RAM映射到地址0x0开始的空间。(4) 完成其他的初始化代码。27012.1.1嵌入式应用系统中的存储映射嵌入式应用系统中的存储映射对地址空地址空间进行重映射的存行重映射的存储器解器

216、解码器可以通器可以通过下下面的操作面的操作简单地地实现:caseADDR(31:24)iswhen0x00ifREMAP=0thenselectROMelseselectSRAMwhen0x0FselectROMwhen.27112.1.2系统初始化系统初始化1.系系统运行运行环境的初始化境的初始化标识整个代码的初始入口点。设置异常中断向量表。初始化存储系统。初始化各模式下的数据栈。初始化一些关键的I/O接口。初始化异常中断需要使用的RAM变量。使能异常中断。如果需要的话,切换处理器模式。如果需要的话,切换处理器状态。2.应用程序的初始化用程序的初始化将已经初始化的数据搬运到可写的数据区。在可

217、写存储区建立ZI属性的可写数据区。27212.2使用使用semihosting的的C语言程序示例语言程序示例semihosting技技术将将应用程序中的用程序中的I/O请求通求通过一定一定的通道的通道传送到主机送到主机(Host),由主机上的,由主机上的资源响源响应应用程序的用程序的I/O请求,而不是像通常那求,而不是像通常那样,由,由应用程序用程序所在的所在的计算机响算机响应应用程序的用程序的I/O请求。求。SWI指令可以根据指令中的参数,以及相关寄存器指令可以根据指令中的参数,以及相关寄存器的的值选择执行某个特定的子程序。行某个特定的子程序。ARM体系利用体系利用SWI提供提供semiho

218、sting功能。功能。本例是一个使用本例是一个使用semihosting的的C语言程序示例。言程序示例。程序中包含了函数程序中包含了函数main()。这时,C运行运行时库中的中的函数函数_main()将完成前面介将完成前面介绍的各种初始化操作,的各种初始化操作,应用程序中不需要用程序中不需要进行行这些初始化操作。些初始化操作。27312.2.1源程序分析源程序分析在在main()函数中,函数中,调用了一些用用了一些用户自己定自己定义的子函数,包括的子函数,包括demo_malloc()、demo_sscanf()、demo_printf()、demo_float_print()及及demo_s

219、printf()。这些子程序使用些子程序使用semihosting的的SWIs实现相相应的功能。的功能。本本应用程序可以运行在本例所描述的用程序可以运行在本例所描述的semihosting环境中,也可以运行在嵌入境中,也可以运行在嵌入式式环境下。程序中的宏境下。程序中的宏变量量EMBEDDED用来区分用来区分这两种运行两种运行环境。当定境。当定义了了EMBEDDED时,程序运行于嵌入式,程序运行于嵌入式环境,当未定境,当未定义EMBEDDED时,程序运行,程序运行于于semihosting环境。境。当程序运行于嵌入式当程序运行于嵌入式环境境时,该嵌入式系嵌入式系统的存的存储系系统有两种映射方式

220、。在第有两种映射方式。在第1种方式中,系种方式中,系统运行期运行期间地址地址0x0处为RAM,在系,在系统复位复位时,ROM被映射到地被映射到地址址0x0处,程序的前几条指令将,程序的前几条指令将RAM重新映射到地址重新映射到地址0x0处。这种方式通种方式通过定定义程序中的宏程序中的宏变量量ROM_RAM_REMAP来来标识。在第。在第2种方式中,不种方式中,不进行地址重行地址重映射,映射,这是通是通过不定不定义程序中的宏程序中的宏变量量ROM_RAM_REMAP来来标识的。的。就本例而言,程序中宏就本例而言,程序中宏变量量EMBEDDED、ROM_RAM_REMAP以及以及USE_SERIA

221、L_PORT都没有被定都没有被定义。程序。程序实际上只运行上只运行main()中最后几个子中最后几个子程序程序调用。用。这几个子程序使用几个子程序使用semihostingSWIs提供的功能,在提供的功能,在Angel、Armulator和和MultiICE中都提供了中都提供了semihostingSWIs功能,用功能,用户不需要写其他不需要写其他代代码。27412.2.2生成映像文件生成映像文件1.编译C程序源文件程序源文件2.连接源文件接源文件3.运行映像文件运行映像文件27512.3一个嵌入式应用系统示例一个嵌入式应用系统示例本例是在本例是在12.2中示例的基中示例的基础上建立的。上建立

222、的。12.2中的示中的示例运行例运行环境是境是semihosting,其中很多的系,其中很多的系统初始初始化操作是由化操作是由C运行运行时库完成的,用完成的,用户并不需要并不需要编写写相相应的代的代码。本例提供了系。本例提供了系统初始化所需要的操作初始化所需要的操作代代码,它可以嵌入于目,它可以嵌入于目标系系统中中执行,不需要行,不需要semihosting功能支持。功能支持。27612.3.1源程序分析源程序分析1.main()函数的修改函数的修改2.异常中断向量表以及异常中断异常中断向量表以及异常中断处理程序理程序3.重新重新实现低低级I/O功能功能4.串行端口的串行端口的驱动程序程序27

223、712.3.2生成映像文件生成映像文件1.汇编汇编语言源程序言源程序2.编译C语言源程序言源程序3.连接源文件接源文件4.生成写入生成写入ROM的映像文件的映像文件5.运行映像文件运行映像文件27812.3.3本例中地址映射模式本例中地址映射模式本例中,地址本例中,地址0x0开始的开始的ROM中包含了代中包含了代码段段(RO段段);地址;地址0x040000开始的开始的RAM中包含了数据段以中包含了数据段以及数据及数据栈和数据堆;在和数据堆;在init.s中将数据中将数据栈指指针初始化初始化成成0x80000;retarget.c中的中的_user_initial_stackheap将数据堆指

224、将数据堆指针初始化成初始化成0x060000。在本例的在本例的应用程序中,使用了用程序中,使用了main()函数,因此函数,因此_main()函数将会函数将会调用相用相应的的C运行运行时库中的相关功能,将中的相关功能,将RW数据从数据从ROM中复制到中复制到RAM中,并在中,并在RAM中建中建立立ZI数据段。如果在程序中没有使用数据段。如果在程序中没有使用main()函数,函数,则应用程序需要自己用程序需要自己进行相关的数据复制和初始化行相关的数据复制和初始化工作。工作。27912.4进行进行ROM/RAM地址重映射的嵌入式应用系统地址重映射的嵌入式应用系统12.4.1地址映射模式地址映射模式

225、在一个嵌入式设备中,为了保持好的性能价格比,通常在系统中存在多种存储器。在本例中,系统中包含Flash、16位的RAM以及32位的RAM。在系统运行之前,所有程序和数据保存在Flash中。系统启动后,包含异常中断处理和数据栈的vectors.o模块被移动到32位的片内RAM中,在这里可以得到较快的运行速度;RW数据以及ZI数据被移动到16位片外RAM中;其他大多数的RO代码在Flash中运行,它们所在的域为固定域。作为嵌入式系统,在系统复位时,RAM中不包含任何程序和数据,这时所有的程序和数据都保存在Flash中。在ARM系统中,通常在系统复位时把Flash映射到地址0x0处,从而使得系统可以

226、开始运行。在Flash中的前几条指令实现重新将RAM映射到地址0x0处。28012.4.1地址映射模式本例中,地址映射模式如本例中,地址映射模式如图12.2所示。所示。28112.4.2源程序分析源程序分析本例的源代本例的源代码和和12.3节中示例的源代中示例的源代码完全一完全一样。在。在12.3节的示例中,的示例中,ROM固定在地址固定在地址0x0处,系,系统没有没有进行行ROM/RAM地址重映射,地址重映射,这是通是通过不定不定义宏宏变量量ROM_RAM_REMAP来来实现的。当不未定的。当不未定义宏宏变量量ROM_RAM_REMAP时,源文件,源文件init.s中的相关部分会被中的相关部

227、分会被汇编器忽略,因而不器忽略,因而不进行行ROM/RAM地址重映射。地址重映射。在本例中定在本例中定义了宏了宏变量量ROM_RAM_REMAP,汇编器将会器将会把相关的代把相关的代码包含到包含到应用程序中,用程序中,进行行ROM/RAM地址重映地址重映射。受宏射。受宏变量量ROM_RAM_REMAP控制的那些代控制的那些代码在在12.3节中没有介中没有介绍,这些代些代码如程序如程序12.6所示。所示。程序程序12.6源文件源文件init.s中与地址重映射相关的代中与地址重映射相关的代码:参见教材P40328212.4.3生成映像文件生成映像文件1.汇编汇编语言源程序言源程序2.编译C语言源程

228、序言源程序3.连接源文件接源文件4.生成生成烧入入ROM的映像文件的映像文件5.运行映像文件运行映像文件28312.5一个嵌入式操作系统示例一个嵌入式操作系统示例1.数据段的搬运数据段的搬运2.异常中断向量表的搬运异常中断向量表的搬运3.设置各种置各种处理器模式理器模式对应的数据的数据栈284第第13章章使用使用CodeWarrior在前面已在前面已经介介绍过ARM各开各开发工具的命令行格式。工具的命令行格式。CodeWarriorforARM集成了集成了这些开些开发工具,使其工具,使其更直更直观,使用更方便。,使用更方便。本章本章简单介介绍CodeWarriorforARM的使用方法。的使用

229、方法。主要介主要介绍在在CodeWarrior中工程文件的中工程文件的组织方法以方法以及生成映像文件及生成映像文件时的的选项设置方法。置方法。28613.1CodeWarriorforARM概述概述CodeWarriorforARM集成开集成开发环境主要提供了下境主要提供了下面一些功能。在本章中主要介面一些功能。在本章中主要介绍前面的两个功能。前面的两个功能。本本节主要介主要介绍一些基本概念:一些基本概念:按照工程项目的方式来组织源代码文件、库文件以及其他文件。设置各种生成选项,以生成不同配置的映像文件。一个源代码编辑器。该编辑器可以根据语言的语法格式使用不同的颜色显示代码中不同的部分。一个源

230、代码浏览器。它保存了代码中定义的各种符号,使得用户可以在源代码中方便地跳转。在文本文件中进行字符串的搜索和替换。文本文件的比较功能。用户还可以根据自己的爱好设置集成环境的特色界面。28713.2简单工程项目的使用简单工程项目的使用在在CodeWarrior中,通中,通过工程工程项目来目来组织用用户的源的源文件、文件、库文件、文件、头文件以及其他的文件以及其他的输入文件。入文件。这些些文件可以按照某种文件可以按照某种逻辑关系关系进行分行分组;一个工程;一个工程项目中目中还可以包含其他的子工程可以包含其他的子工程项目。一个工程目。一个工程项目目中至少包含一个生成目中至少包含一个生成目标,每个生成目

231、,每个生成目标定定义了一了一组选项,用于生成特定的目,用于生成特定的目标文件。本文件。本节介介绍CodeWarrior中工程中工程项目的用法。目的用法。28813.2.1工程项目窗口工程项目窗口工程工程项目窗口如目窗口如图13.1所示。它包括所示。它包括Files视图、LinkOrder视图和和Targets视图,共,共3种种视图。1.Files视图2.LinkOrder视图3.Target视图Semihosted。Embedded。EmbeddedScatter。EmbeddedScatterRemap。28913.2.2简单工程项目的使用简单工程项目的使用1.建立一个新的工程建立一个新的工

232、程项目目2.建立一个新的源文件建立一个新的源文件3.将已将已经存在的源文件加入到工程存在的源文件加入到工程项目中目中4.将工程将工程项目中的文件分目中的文件分组5.删除文件或者除文件或者组6.保存工程保存工程项目目7.关关闭工程工程项目目8.选择默默认工程工程项目目9.移移动工程工程项目目29013.3配置生成目标配置生成目标一个工程一个工程项目中可以包含多个生成目目中可以包含多个生成目标。各生成目。各生成目标具有不同的生成具有不同的生成选项,这些些选项包括包括编译器器选项、汇编器器选项和和连接器接器选项等,它等,它们决定了决定了CodeWarriorIDE如何如何处理本工程理本工程项目,以生

233、成特目,以生成特定的定的输出文件。本出文件。本节介介绍在在ADS中如何配置各生成中如何配置各生成选项。29129213.3.1DebugSettings对话框介绍对话框介绍在在ADS中通中通过DebugSettings对话框来框来设置一个置一个工程工程项目中的各生成目目中的各生成目标的生成的生成选项。在。在TargetSettings窗口中窗口中设置的各生成置的各生成选项只适用于当前的只适用于当前的生成目生成目标。例如,当使用。例如,当使用ADS中的可中的可执行映像文件行映像文件工程工程项目模板生成新的工程目模板生成新的工程项目目时,新工程,新工程项目中目中通常包括下面通常包括下面3个生成目个

234、生成目标。Debug:包含了所有调试信息。DebugRel:包含了部分调试信息。Release:不包含调试信息。29313.3.2设置生成目标的基本选项设置生成目标的基本选项生成目生成目标的基本的基本选项用于用于设置当前生成目置当前生成目标的一些的一些基本信息,包括生成目基本信息,包括生成目标的名称、所使用的的名称、所使用的连接器接器等。它包括下面几等。它包括下面几组选项:TargetSettings选项组。AccessPaths选项组。BuildExtras选项组。FileMappings选项组。SourceTrees选项组。29413.3.2设置生成目标的基本选项设置生成目标的基本选项1.

235、设置置TargetSettings选项组2.设置置AccessPaths选项组3.设置置BuildExtras选项组4.设置置FileMappings选项组5.设置置SourceTrees选项组29513.3.3汇编器选项的设置汇编器选项的设置本小本小节介介绍CodeWarriorIDE中内嵌的中内嵌的汇编器的器的选项设置。打开置。打开TargetSettings对话框,在左框,在左边的的TargetSettingsPanels列表框中列表框中选择LanguageSettings选项,再在其下,再在其下选择ARMAssembler选项,即可,即可得到得到汇编器器选项设置界面,如置界面,如图13

236、.19所示。在所示。在该设置界面中包含置界面中包含6个个选项卡,分卡,分别是是Target、ATPCS、Options、Predefines、ListingControl和和Extras选项卡。卡。在每个在每个选项卡中,卡中,EquivalentCommandLine列表框中列出了当前列表框中列出了当前汇编器器选项设置的命令行格式。有一些置的命令行格式。有一些汇编器器选项设置没有提供置没有提供图形界面,形界面,需要使用命令行格式来需要使用命令行格式来设置。置。29613.3.3汇编器选项的设置汇编器选项的设置1.Target选项卡卡2.ATPCS选项卡卡3.Options选项卡卡4.Prede

237、fines选项卡卡5.ListingControl选项卡卡6.Extras选项卡卡29713.3.4编译器的选项设置编译器的选项设置本小本小节介介绍CodeWarriorIDE中内嵌的中内嵌的编译器的器的选项设置。置。打开打开TargetSettings对话框,在左框,在左边的的TargetSettingsPanels列表框中列表框中选择LanguageSettings项下的下的ARMCCompiler选项,即可得到,即可得到ARMC语言言编译器器armcc的的选项设置界面,如置界面,如图13.24所示。所示。在在该界面中包含界面中包含8个个选项卡,分卡,分别是是TargetandSource

238、、ATPCS、Warnings、Errors、DebugandOptimization、Preprocessor、CodeGeneration和和Extras选项卡。卡。29813.3.4编译器的选项设置编译器的选项设置1.TargetandSource选项卡卡2.ATPCS选项卡卡3.Warnings选项卡卡4.Errors选项卡卡5.Debug/Optimization选项卡卡6.Preprocessor选项卡卡7.CodeGeneration选项卡卡8.Extras选项卡卡29913.3.5连接器的选项设置连接器的选项设置本本节介介绍CodeWarriorIDE中内嵌的中内嵌的连接器的接

239、器的选项设置。打开置。打开TargetSettings对话框,在左框,在左边TargetSettingsPanels列表框中列表框中选择Linker选项,再在,再在其下其下选择ARMLinker,即可得到,即可得到连接器的接器的选项设置界面,如置界面,如图13.32所示。所示。30013.3.5连接器的选项设置连接器的选项设置1.Output选项卡卡2.Options选项卡卡3.Layout选项卡卡4.Listings选项卡卡5.Extras选项卡中的卡中的选项设置置30113.3.6fromELF工具的选项设置工具的选项设置本本节介介绍CodeWarriorIDE中工具中工具fromELF的

240、的选项设置。打开置。打开TargetSettings对话框,在左框,在左边的的TargetSettingsPanels列表框中列表框中选择Linker选项,再在其下再在其下选择ARMfromELF选项,如,如图13.39所示。所示。30213.4复杂工程项目的使用复杂工程项目的使用复复杂工程工程项目是指包括多个生成目目是指包括多个生成目标或包含子工程或包含子工程项目的工程目的工程项目。在使用复目。在使用复杂工程工程项目目时,需要考,需要考虑下面几个下面几个问题。工程项目的结构一个工程项目中生成目标的数量包含经过充分测试的代码包含密切相关的代码对于代码的存取方式30313.4.1建立一个新的生成

241、目标建立一个新的生成目标可以在工程可以在工程项目窗口的目窗口的Target视图建立一个新的生成目建立一个新的生成目标。具体的操作步具体的操作步骤如下。如下。(1)打开前面建立的工程项目示例example.mcp。(2)在工程项目窗口中选择Target视图。(3)选择Project|CreateNewTarget命令,CodeWarriorIDE弹出NewTarget对话框,如图13.40所示。(4)在Namefornewtarget文本框中输入新生成目标的名称。这里输入“semihosted”。(5)选择新的生(6)单击OK按钮,生成一个新的生成目标。(7)根据具体需要,设置新的生成目标。成目

242、标的类型30413.4.1建立一个新的生成目标建立一个新的生成目标使用使用ProjectInspector对话框向生成目框向生成目标中添加文件的操中添加文件的操作步作步骤如下。如下。(1)打开前面建立的example.mcp工程项目示例文件。(2)在工程项目窗口中选择需要加入某生成目标的文件。(3)选择Windows|ProjectInspector命令,弹出ProjectInspector对话框。(4)打开Targets选项卡,其中显示了本工程项目中的所有生成目标,如图13.42所示。(5)选中相应的复选框,将本文件加入到该生成目标中。(6)单击Revert按钮放弃所做的修改;单击Save按

243、钮保存所做的修改。30513.4.2将一个生成目标更名将一个生成目标更名修改一个生成目修改一个生成目标的名称的操作步的名称的操作步骤如下。如下。(1)打开前面建立的工程项目示例example.mcp。(2)在工程项目窗口中选择Targets视图。(3)双击想要更名的生成目标,这里双击semihosted,CodeWarriorIDE弹出semihostedSettings对话框,如图13.43所示。(4)在semihostedSettings对话框中选择TargetSettings面板。在TargetName文本框中输入新的生成目标名称。(5)单击Save按钮,保存所做的修改。30613.4.

244、3建立生成目标之间的依赖关系建立生成目标之间的依赖关系对于包含多个生成目于包含多个生成目标的工程的工程项目,可以建立各生成目目,可以建立各生成目标之之间的依的依赖关关系。如果生成目系。如果生成目标A依依赖于生成目于生成目标B,则称称A生成目生成目标为主生成目主生成目标;称称B生成目生成目标为被依被依赖的生成目的生成目标。CodeWarriorIDE在在处理一个主生理一个主生成目成目标时,首先,首先处理理该生成目生成目标所依所依赖的被依的被依赖生成目生成目标。仅仅建立两建立两个生成目个生成目标之之间的依的依赖关系,并未关系,并未强制制连接器将两个生成目接器将两个生成目标的文件的文件进行行连接。要

245、将被依接。要将被依赖的生成目的生成目标的的输出文件出文件连接到主生成目接到主生成目标的的输出文出文件,需要件,需要显式地建立式地建立这种种连接关系。接关系。在在CodeWarriorIDE中,工程中,工程项目生成命令目生成命令Make仅处理当前活理当前活动的工的工程程项目,目,CodeWarriorIDE中没有提供一个中没有提供一个类似于似于BuildAll的命令来的命令来处理一个工程理一个工程项目中的所有生成目目中的所有生成目标。在本小。在本小节中,建立一个没有中,建立一个没有实际意意义的空生成目的空生成目标dummy,然后将其他所有的生成目,然后将其他所有的生成目标加入到生成目加入到生成目

246、标dummy中,中,这样,在生成,在生成dummy时,所有的生成目,所有的生成目标都将被都将被处理。理。30713.4.4子工程项目的使用子工程项目的使用CodeWarriorIDE可以在一个工程可以在一个工程项目中包含另外一个独立目中包含另外一个独立的工程的工程项目,被包含的工程目,被包含的工程项目称目称为子工程子工程项目。在目。在实际系系统中,通常需要将一个工程中,通常需要将一个工程项目分割成多个相目分割成多个相对独立的子工独立的子工程程项目,目,这些子工程些子工程项目可以由不同的开目可以由不同的开发组完成,最后集完成,最后集成成为最最终系系统。每个子工程。每个子工程项目可以包含多个生成目

247、目可以包含多个生成目标;各;各生成目生成目标的的输出文件是否与主工程出文件是否与主工程项目的某个生成目目的某个生成目标的的输出文件出文件连接,也可以独立控制。接,也可以独立控制。使用子工程使用子工程项目包括下面三个步目包括下面三个步骤。首先,将一个子工程项目加入到主工程项目的一个或者多个生成目标中。其次,指定主工程项目被CodeWarriorIDE处理时,它所包含的子工程项目中的哪些生成目标需被处理。默认情况下,子工程项目的所有生成目标都不会被处理。最后,指定子工程项目的那些生成目标的输出文件需要与主工程项目的输出文件进行连接。默认情况下,所有生成目标的输出文件都不需要与主工程项目的输出文件进

248、行连接。30813.5工程项目模板工程项目模板工程工程项目模板是一些最小的工程目模板是一些最小的工程项目,它可以作目,它可以作为模板,用来快速、模板,用来快速、简单地生成其他具有同地生成其他具有同样特点的特点的工程工程项目。工程目。工程项目模板中包含下面的信息:目模板中包含下面的信息:预先定义的生成目标的各种选项。预先定义的生成目标、子工程以及工程之间的相互依赖关系。一些特定种类的文件。当用当用户使用一个工程使用一个工程项目模板建立一个工程目模板建立一个工程项目目时,CodeWarriorIDE将与将与该工程工程项目模板相关的文件目模板相关的文件复制到新建的工程复制到新建的工程项目所在的目目所

249、在的目录中。用中。用户在此基在此基础之上建立自己的工程之上建立自己的工程项目。目。30913.5.1ADS中工程项目模板的使用中工程项目模板的使用ADS中的工程中的工程项目模板默目模板默认放在路径放在路径C:ProgramFilesarmadsv1_1stationery中。中。ADS中提供的工程中提供的工程项目目模板包括以下几种。模板包括以下几种。ARMExecutableImage:ARM可执行映像文件模板。ARMObjectLibrary:ARM目标文件库模板。EmptyProject:空工程项目模板。MakefileImporterWizard:Makefile导入向导模板。ARMTh

250、umbInterworkingImage:ARM/Thumb混合使用的映像文件模板。ThumbExecutableImage:Thumb可执行映像文件模板。ThumbObjectLibrary:Thumb目标文件库模板。这些工程些工程项目模板都使用以下目模板都使用以下设置:置:默认的目标系统设置,如ARM7TDMILittleendian等。编译器和汇编器使用默认的ATPCS选项。包括3个生成目标:Debug、DebugRel以及Release。31013.5.1ADS中工程项目模板的使用中工程项目模板的使用1.ADS中中预定定义的主要工程的主要工程项目模板目模板2.ARM/Thumb混合使用

251、的映像文件模板的使用混合使用的映像文件模板的使用3.将一个将一个ARM工程工程项目目转换成一个成一个Thumb工程工程项目目31113.5.2建立用户工程项目模板建立用户工程项目模板在在CodeWarriorIDE中,作中,作为工程工程项目模板的特殊目模板的特殊的工程的工程项目,具有以下两个特点:目,具有以下两个特点:该工程项目位于CodeWarriorIDE的工程目标模板目录中。默认情况下为C:programfilesARMADSv1_1stationery。该工程项目中包含的文件与该工程项目保存在一起。用用户可以建立自己的工程可以建立自己的工程项目模板。然后使用目模板。然后使用该工工程程项

252、目模板,目模板,CodeWarriorIDE会将与会将与该工程工程项目目模板相关的文件复制到新建立的工程模板相关的文件复制到新建立的工程项目的路径中。目的路径中。31213.6编译和连接工程项目编译和连接工程项目在在CodeWarriorIDE中可以同中可以同时打开多个工程打开多个工程项目,必目,必须选择一个工程一个工程项目作目作为当前工程当前工程项目,然后可以目,然后可以对其中包含的其中包含的文件文件进行行编译和和连接操作。接操作。编译和和连接工程接工程项目中的文件目中的文件时,需要确定下面两个需要确定下面两个问题:确定工程确定工程项目中各种源文件使用何种工具目中各种源文件使用何种工具进行行

253、处理。理。选择工程工程项目中的一个生成目目中的一个生成目标。在在13.5节中介中介绍了了ADS中提供的各种工程中提供的各种工程项目模板的特点,目模板的特点,其中包含各种源文件其中包含各种源文件对应的的处理工具。可以通理工具。可以通过BuildTargetSettings对话框中的框中的FileMappings面板控制面板控制这种源种源文件及其文件及其处理工具的理工具的对应关系。关系。关于生成目关于生成目标的配置和的配置和选择,在,在13.3节中已中已经介介绍过。所有。所有对一个工程一个工程项目中文件的目中文件的编译和和连接操作都是接操作都是针对当前生成当前生成目目标的,其他的生成目的,其他的生

254、成目标不受影响。不受影响。31313.6.1编译文件编译文件1.编译当前当前编辑窗口中的文件窗口中的文件2.编译在工程在工程项目窗口中目窗口中选中的文件中的文件3.编译工程工程项目中目中发生生变化的文件化的文件4.预处理源文件理源文件5.对源文件源文件进行行语法法检查31413.6.2生成工程项目生成工程项目1.生成工程生成工程项目目2.设置置连接接顺序序3.删除目除目标文件文件315第第14章章ARM体系中的调试方法体系中的调试方法随着随着应用系用系统复复杂性的提高,性的提高,调试阶段在整个系段在整个系统开开发的的过程中所占的比重越来越大。因此程中所占的比重越来越大。因此拥有高效、有高效、强

255、大的大的调试系系统可以大大减少整个系可以大大减少整个系统开开发的的时间,加快加快产品面市品面市时间,减,减轻系系统开开发的工作量。的工作量。ARM体系体系结构包含了完善的构包含了完善的调试手段,本章介手段,本章介绍ARM体体系中系中调试系系统的原理以及一些常用的的原理以及一些常用的调试工具。工具。31714.1ARM体系中的调试系统概述体系中的调试系统概述图14.1中中给出了出了ARM体系中体系中调试系系统的原理。的原理。在主机上运行的在主机上运行的调试程序用于接收用程序用于接收用户的命令,把的命令,把用用户命令通命令通过主机和目主机和目标机之机之间的通信信道的通信信道发送到送到目目标机,接收

256、从目机,接收从目标机返回的数据并按照用机返回的数据并按照用户指定指定的格式的格式进行行显示。示。31814.1ARM体系中的调试系统概述体系中的调试系统概述调试代理代理(DebugAgent)通常运行在目通常运行在目标机上机上(ARMulator除外,它运行于主机上除外,它运行于主机上),它接收主机,它接收主机上上调试器器发来的命令,可以在目来的命令,可以在目标程序中程序中设置断点,置断点,单步步执行目行目标程序,程序,显示程序断点示程序断点处的运行状的运行状态(寄寄存器和内存存器和内存值)。在。在ARM体系中,体系中,调试代理可以有代理可以有下面下面4种方式:种方式:ARMulator是一种

257、比较特殊的调试代理。基于JTAG的ICE类型的调试代理。Angel调试监控程序。调试网关。31914.2基于基于Angel的调试系统的调试系统基于基于Angel的的调试系系统由下面两部分由下面两部分组成,成,这两部两部分之分之间通通过一定的通信信道一定的通信信道连接起来,通常使用的接起来,通常使用的信道是串行口。信道是串行口。位于主机上的调试器(Debugger)位于目标机上的Angel调试监控程序本本节对Angel的原理、功能以及移植方法做了比的原理、功能以及移植方法做了比较详细的介的介绍。一方面是因。一方面是因为Angel是一个很有用的是一个很有用的调试工具;另一方面是因工具;另一方面是因

258、为通通过对Angel的分析,的分析,对于于设计目目标系系统的启的启动代代码是非常有帮助的。在是非常有帮助的。在本本节中,比中,比较详细地介地介绍了基于了基于LinkUp公司的公司的L7205sdb评价板的价板的Angel,也正是出于,也正是出于这一目的。一目的。32014.2.1基于基于Angel的调试系统的概述的调试系统的概述1.Angel的的组成成(1)主机上的调试器(2)目标系统2.Angel的功能的功能(1)基本的调试功能(2)C语言库的支持(3)通信支持(4)任务管理功能(5)异常中断处理3.使用使用Angel所需要的所需要的资源源系统资源ROM和RAM资源异常中断向量FIQ及IRQ

259、异常中断数据栈32114.2.2使用使用Angel开发应用程序开发应用程序1.两个版本的两个版本的Angel2.使用使用Angel开开发应用程序的一般用程序的一般过程程3.使用完整版本的使用完整版本的Angel开开发应用程序用程序(1)开发应用程序时需要规划的内容(2)编程限制(3)Angel和RTOS一起使用(4)用户应用程序在处理器特权模式下执行(5)异常中断处理程序链接(6)C语言运行时库的使用方式(7)在调试时使用断言(Assertions)(8)关于断点的设置4.使用最小版本的使用最小版本的Angel开开发应用程序用程序5.下下载应用程序用程序32214.2.3Angel执行的操作执

260、行的操作Angel主要主要执行下面的操作,理解行下面的操作,理解这些操作些操作对于移于移植植Angel是非常有好是非常有好处的:的:初始化。等待与主机上的调试机进行通信。实现调试器请求的功能。任务管理。所有的Angel操作都是由任务管理器控制的。任务管理器管理所有任务的优先级和调度规则。关于任务管理的详细介绍,可以参考ARM的相关文档。上下文切换。Angel维护着所有任务的运行上下文,可以实现任务切换。32314.2.3Angel执行的操作执行的操作1.初始化初始化2.等待与主机上的等待与主机上的调试机机进行通信行通信3.实现调试器器请求的功能求的功能(1)报告存储器和处理器状态(2)下载应用

261、程序映像文件(3)设置断点32414.2.4将将Angel移植到特定的目标系统移植到特定的目标系统1.Angel源代源代码的目的目录结构构2.Angel移植的一般步移植的一般步骤3.修改修改Angel中与目中与目标系系统相关的源文件相关的源文件32514.3基于基于JTAG的调试系统的调试系统本本节以以ARM7TDMI为例,介例,介绍ARM体系中基于体系中基于JTAG接口的接口的调试系系统。32632714.3.1基于基于JTAG的调试系统的特点的调试系统的特点与基于与基于Angel的的调试系系统相比,基于相比,基于JTAG的的调试系系统具有以下的特点:具有以下的特点:可以重复利用JTAG硬件

262、测试接口。可以提供JTAG接口访问系统状态和内核状态。在进行调试时不需要在目标系统上运行程序。这样,对于一个“裸的”目标系统也可以进行调试。而基于Angel的调试系统则需要在目标系统上运行监控程序,这就需要一个可以工作的最小系统。除了可以在RAM中设置断点外,还可以在ROM中设置断点。可以通过在目标处理器中添加一些硬件,扩展调试功能。不像基于Angel的调试系统那样,需要通过一个UART进行通信。32814.3.2基于基于JTAG的调试系统结构的调试系统结构基于基于JTAG的的调试系系统结构如构如图14.5所示,它包括所示,它包括3部分:位于主机上的部分:位于主机上的调试器,例如器,例如ARM

263、公司的公司的ADW等;包括硬件嵌入式等;包括硬件嵌入式调试部件的目部件的目标系系统;在;在主机和目主机和目标系系统之之间进行行协议分析、分析、转换的模的模块。ARM公司的公司的ADW是一个基于是一个基于Windows操作系操作系统的的调试器,在器,在14.4节中将介中将介绍ADW的使用方法。的使用方法。(1)目标系统的结构如图14.6所示。32914.3.2基于基于JTAG的调试系统结构的调试系统结构(2)目目标系系统包含的硬件包含的硬件调试功能功能扩展部件可以展部件可以实现下面的功能:下面的功能:停止目标程序的执行。查看目标内核的状态。查看和修改存储器的内容。继续程序的执行。(3)图14.6

264、中,中,3条条扫描描链的含的含义如下:如下:扫描链0可以用来访问ARM7TDMI的所有外围部件,包括数据总线在内。整个扫描链从输入到输出包含下面几部分:数据总线,从位0到位31。控制信号。地址总线从位31到位0。扫描链1是扫描链0的一部分。它包括数据总线和控制线BREAKPT。整个扫描链从输入到输出如下所示:数据总线,从位0到位31。控制信号BREAKPT。扫描链2主要用于访问EmbeddedICE逻辑部件中的各寄存器。33014.3.3目标系统中的调试功能扩展部件目标系统中的调试功能扩展部件在在ARM7TDMI处理器中,理器中,EmbeddedICE逻辑部件提供了集部件提供了集成在芯片内的成

265、在芯片内的对内核内核进行行调试的功能。的功能。这部分功能是通部分功能是通过处理器上的理器上的TAP控制器串行控制的。控制器串行控制的。图14.7表示了表示了处理器内核、理器内核、EmbeddedICE逻辑部件和部件和TAP控制器之控制器之间的关系,以及一些主要的控制信号。的关系,以及一些主要的控制信号。33114.3.4基于基于JTAG的调试过程的调试过程在在调试目目标系系统时,首先要通,首先要通过一定的方式使目一定的方式使目标系系统进入入调试状状态。在。在调试状状态下就可以完成各种下就可以完成各种调试功能,例如功能,例如查看看处理器状理器状态、查看和修改存看和修改存储器内容等。器内容等。AR

266、M7TDMI可可以通以通过下面的方式下面的方式进入入调试状状态。通过设置程序断点(Breakpoint)。通过设置数据断点(Watchpoint)。从相应的外部请求进入调试状态。在目在目标程序中特定的位置程序中特定的位置设置断点后,当置断点后,当该位置位置处的指令的指令进入指令流水入指令流水线时,ARM7TDMI内核将内核将该指令表示指令表示为断点指断点指令。当程序令。当程序执行到断点指令行到断点指令时,处理器理器进入入调试状状态,此,此时断点指令断点指令还没有被没有被执行。行。这时,用,用户就可以就可以执行需要的行需要的调试功能。功能。33214.3.4基于基于JTAG的调试过程的调试过程当

267、断点当断点设置在条件指令上置在条件指令上时,不管,不管该指令指令执行的条件能否得行的条件能否得到到满足,当足,当该指令到达指令到达执行周期行周期时,处理器都会理器都会进入入调试状状态。在某条指令上在某条指令上设置了断点后,如果在置了断点后,如果在该指令到达指令到达执行周期之行周期之前,程序前,程序发生了跳生了跳转,或者,或者发生了异常中断,断点指令就可生了异常中断,断点指令就可能得不到能得不到执行。行。这种情况下,种情况下,处理器将会刷新指令流水理器将会刷新指令流水线,从而使得从而使得处理器不会在理器不会在该断点指令断点指令处进入入调试状状态。当用当用户设置了数据断点置了数据断点时,目,目标系

268、系统中的中的调试部件将会部件将会监视数据数据总线。如果用。如果用户设置的条件得到了置的条件得到了满足,足,处理器将会在理器将会在执行完当前指令后行完当前指令后进入入调试状状态。如果当前指令是。如果当前指令是LDM或或者者STM,处理器将会在完成所有指令操作后理器将会在完成所有指令操作后进入入调试状状态。33314.4ADW使用介绍使用介绍14.4.1ADW概述概述ADW是包含在ADS中的运行于Windows操作系统中的调试器。其人机界面如图14.8所示。其中包含了下面3部分:菜单栏、工具栏和状态栏。用来显示被调试的映像文件的各种窗口。每个窗口有一个与之关联的菜单,其中包含了本窗口可以进行的操作

269、。33414.4.1ADW概述ADW是一个功能是一个功能强大、操作大、操作简单的的调试器。它包含了下列器。它包含了下列基本的基本的调试功能:功能:下载目标映像文件到目标系统中,如果目标系统支持,还可以将映像文件烧入到目标系统的Flash中。在目标程序中设置断点,包括程序断点和数据断点。查看和修改断点处处理器的状态。查看和修改断点处存储器的内容。查看和修改目标程序中变量的值。单步执行目标程序,并可以显示反汇编的代码或者源程序代码。ADW还可以调试C+程序。ADW支持的支持的调试目目标如下:如下:ARMulator。基于JTAG的ICE类型的调试代理。Angel调试监控程序。调试网关。33514.

270、4.1ADW概述基于基于JTAG的的ICE类型的型的调试代理,利用代理,利用ARM处理理器中的器中的JTAG接口以及一个嵌入的接口以及一个嵌入的调试单元可以与元可以与主机上的主机上的调试器器进行通信,完成下面的工作:行通信,完成下面的工作:实时地设置基于指令地址值或者基于数据值的断点。控制程序单步执行。访问,并且可以控制ARM处理器内核。访问ASIC系统。访问系统中的存储器。访问I/O系统。33614.4.1ADW概述在在ADW中使用中使用Angle或者或者EmbeddICE的的设置方法如下。置方法如下。(1)选择Options|ConfigureDebugger命令,打开DebuggerCo

271、nfiguration对话框,如图14.9所示。(2)在Target选项卡的TargetEnvironment下拉列表框中选择C:ProgramFilesARMADSv1_1BinRemote_A.dll选项。(3)单击Configure按钮,打开Remote_Aconnection对话框,如图14.11所示。(4)在Remote_Aconnection对话框中,单击Select按钮,打开AvailableConnectionDrivers对话框,在其中选用适当的通信方式。这里选择了ARMSerialDriver。然后单击OK按钮返回。(5)在Remote_Aconnection对话框中,单击

272、Configure按钮,打开SetupSerialConnection对话框,在其中配置所使用的串行口号和波特率。33714.4.2ADW中的窗口中的窗口1.Execution窗口窗口2.Console窗口窗口3.Command窗口窗口4.Registers窗口窗口5.FunctionName窗口窗口6.Local/Global窗口窗口7.Memory窗口窗口8.Disassembly窗口窗口33814.4.2ADW中的窗口中的窗口9.SearchPaths窗口窗口10.SourceFiles窗口窗口11.Breakpoints窗口窗口12.Watchpoints窗口窗口13.Backtrac

273、e窗口窗口14.LowLevelSymbols窗口窗口15.RDILog窗口窗口16.DebugInternals窗口窗口33914.4.3ADW使用介绍使用介绍1.下下载映像文件映像文件2.设置程序断点置程序断点3.设置数据断点置数据断点(1)简单数据断点(2)复杂数据断点4.Backtrace的使用的使用34014.4.3ADW使用介绍使用介绍5.运行目运行目标程序程序(1)单步执行(2)StepIn命令(3)StepOut命令(4)Runtocursor命令6.Profiling的使用的使用7.将某存将某存储区域内容保存到磁区域内容保存到磁盘文件中文件中8.将某磁将某磁盘文件中的内容复制到特定的存文件中的内容复制到特定的存储区域区域341

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号