《ARM系统硬件设计基础课件.pptx》由会员分享,可在线阅读,更多相关《ARM系统硬件设计基础课件.pptx(40页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础主要内容ADS 1.2集成开发环境简介集成开发环境简介 基于基于ARM的汇编语言程序设计的汇编语言程序设计基于基于ARM的硬件启动程序的硬件启动程序基于基于ARM的的C语言与汇编语言混合编程语言与汇编语言混合编程印制电路板制作简介印制电路板制作简介RVDS 2.2 集成开发环境简介集成开发环境简介 2第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.1 ADS 1.2集成开发环境简介 ADS ADS的英文全称为的英文全称为 ARM Developer SuiteARM Developer Suite,是是ARMARM
2、公司公司推出的新一代推出的新一代ARMARM集成开发工具。集成开发工具。 ADS ADS由六个部分组成,分别是:由六个部分组成,分别是:代码生成工具代码生成工具集成开发环境集成开发环境调试器调试器指令集模拟器指令集模拟器ARMARM开发包开发包ARMARM应用库应用库3第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.1.1 ADS 1.2集成开发环境下工程的创建使用使用ADSADS创建工程的步骤创建工程的步骤 :新建工程新建工程 “File|NewFile|New” 设置目标及其参数设置目标及其参数 “Edit|Debug SettingsEdit|Debug Setting
3、s” 向工程中添加文件向工程中添加文件 “Project|Add FilesProject|Add Files” 4第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础4.1.2 ADS1.2集成开发环境下进行仿真和调试的方法集成开发环境下进行仿真和调试的方法在在CodewarriorCodewarrior中,如果中,如果工程编译成功,将产生工程编译成功,将产生一个后缀为一个后缀为. .axfaxf的映像文的映像文件,接下来就可以使用件,接下来就可以使用AXD DebuggerAXD Debugger进行调试。进行调试。 常用调试按钮常用调试按钮 5第第4 4章章 ARMARM系统硬件
4、设计基础系统硬件设计基础主要内容ADS 1.2集成开发环境简介集成开发环境简介 基于基于ARM的汇编语言程序设计的汇编语言程序设计基于基于ARM的硬件启动程序的硬件启动程序基于基于ARM的的C语言与汇编语言混合编程语言与汇编语言混合编程印制电路板制作简介印制电路板制作简介RVDS 2.2 集成开发环境简介集成开发环境简介 6第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础RVDS 2.2 集成开发环境简介集成开发环境简介 RealView Development Suite(RVDS)是)是ARM公司继公司继SDT与与ADS1.2之后主推的新一代开发工具。之后主推的新一代开发工具。
5、 RVDS集成的集成的RVCT是业内公认的能够支持所有是业内公认的能够支持所有ARM处处理器,并提供最好的执行性能的编译器;理器,并提供最好的执行性能的编译器;RVD是是ARM系统调试方案的核心部分,支持含嵌入式操作系统的单系统调试方案的核心部分,支持含嵌入式操作系统的单核和多核处理器软件开发,可以同时提供相关联的系统核和多核处理器软件开发,可以同时提供相关联的系统级模型构建功能和应用级软件开发功能,为不同用户提级模型构建功能和应用级软件开发功能,为不同用户提供最为合适的调试功效。目前全球基于供最为合适的调试功效。目前全球基于ARM处理器的处理器的40亿个产品设备中,大部分的软件开发是基于亿个
6、产品设备中,大部分的软件开发是基于RealView开开发工具。安全、可靠和高性能地设计产品的最好选择就发工具。安全、可靠和高性能地设计产品的最好选择就是购买是购买ARM RealView开发工具。开发工具。 RVDS向下兼容以前的版本(向下兼容以前的版本(ADS v1.2.1、1.1、1.0.1)。)。7第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础8第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础9第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础主要内容ADS 1.2集成开发环境简介集成开发环境简介 基于基于ARM的汇编语言程序设计的汇编语言程序设计基于
7、基于ARM的硬件启动程序的硬件启动程序基于基于ARM的的C语言与汇编语言混合编程语言与汇编语言混合编程印制电路板制作简介印制电路板制作简介RVDS 2.2 集成开发环境简介集成开发环境简介 10第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.3.1 ARM汇编器支持的伪指令 伪指令是伪指令是ARMARM汇编语言程序中的一些特殊指令助记符,这汇编语言程序中的一些特殊指令助记符,这些助记符与指令系统的助记符不同,没有相对应的操作码,些助记符与指令系统的助记符不同,没有相对应的操作码,它们所完成的操作称为伪操作。它们所完成的操作称为伪操作。伪指令在源程序中的作用是为完成汇编程序做各
8、种准备工伪指令在源程序中的作用是为完成汇编程序做各种准备工作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,作的,这些伪指令仅在汇编过程中起作用,一旦汇编结束,伪指令的使命就完成了。伪指令的使命就完成了。ARMARM汇编器支持的伪指令包括:符号定义伪指令、数据定汇编器支持的伪指令包括:符号定义伪指令、数据定义伪指令、汇编控制伪指令、宏指令以及其他伪指令。义伪指令、汇编控制伪指令、宏指令以及其他伪指令。 11第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础分类分类指令指令举例举例符号定义符号定义伪指令伪指令GBLA/GBLL/GBLS/LCLA/LCLL/LCLS/SETA/SET
9、L/SETS/RLISTGBLA Test1;定义一个名为定义一个名为Test1的全局数值字变量的全局数值字变量数据定义数据定义伪指令伪指令DCB/DCW/DCD/ DCFD/DCFS/DCQ/ SPACE/MAP/ FIELDstr DCB “This is a test”;分配起始地址为分配起始地址为str的一段连续字节存储的一段连续字节存储单元存放字符串单元存放字符串汇编控制汇编控制伪指令伪指令I F / E L S E / E N D I F / WHILE/WEND/IF TestTRUE ;如果条件成立如果条件成立 指令序列指令序列1 ;执行指令序列执行指令序列1ELSE ;否则执
10、行指令序列否则执行指令序列2 指令序列指令序列2ENDIF宏指令宏指令MACRO/MEND/ MEXITMACRO Seg指令序列指令序列MEND;定义一个名为定义一个名为Seg的宏指令的宏指令其他其他伪指令伪指令AREA/ALIGN/CODE16/CODE32/ENTRY/END/EQU/EXPORT/GLOBAL/IMPORT/EXTERN/GET/INCLUDE/INCBINAREA Init,CODE,READONLY,ALIGN=3;定义了一个代码段,段名为定义了一个代码段,段名为Init,属性属性为只读,并指定其后的指令为为只读,并指定其后的指令为8(23)字)字节对齐。节对齐。A
11、RMARM汇编器支持的常见伪指令汇编器支持的常见伪指令 12第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.3.2 基于ARM的汇编语言语句格式 ARMARM汇编语言的语句格式汇编语言的语句格式 标号标号 指令或伪指令指令或伪指令 ; ;注释注释 标号是代表地址的符号,必须在一行的顶格书写,其后不能添加标号是代表地址的符号,必须在一行的顶格书写,其后不能添加冒号冒号“:”,而所有指令均不能顶格书写。,而所有指令均不能顶格书写。ARMARM汇编语言对标识符的大小写敏感,书写标号及指令时字母大汇编语言对标识符的大小写敏感,书写标号及指令时字母大小写要一致。小写要一致。在在ARMA
12、RM汇编语言中,汇编语言中,ARMARM指令、伪指令、寄存器名等可以全部大指令、伪指令、寄存器名等可以全部大写或者全部小写,但不能大小写混合使用。写或者全部小写,但不能大小写混合使用。为了使源文件易读,可以将一条长的指令通过使用反斜杠字符为了使源文件易读,可以将一条长的指令通过使用反斜杠字符“ ”将其分成几行书写。将其分成几行书写。每行从第一个分号开始到本行结束为注释内容,所有的注释内容每行从第一个分号开始到本行结束为注释内容,所有的注释内容均被汇编起忽略。均被汇编起忽略。13第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.3.3 ARM汇编语言程序的基本结构 在在ARMAR
13、M汇编语言程序中,以程序段为单位来组织代码。汇编语言程序中,以程序段为单位来组织代码。段段是相对独立的指令或数据序列,具有特定的名称。段可以是相对独立的指令或数据序列,具有特定的名称。段可以分为分为代码段和数据段代码段和数据段,代码段的内容为执行代码,数据段存,代码段的内容为执行代码,数据段存放代码运行时所需的数据。放代码运行时所需的数据。 可执行映像文件通常由以下几部分构成:可执行映像文件通常由以下几部分构成: 一个或多个代码段,代码段为只读属性(一个或多个代码段,代码段为只读属性(RORO)。)。 零个或多个包含初始化数据的数据段,数据段的属零个或多个包含初始化数据的数据段,数据段的属性为
14、可读写(性为可读写(RWRW)。)。 零个或多个不包含初始化数据的数据段,数据段的零个或多个不包含初始化数据的数据段,数据段的属性为可读写(属性为可读写(ZIZI)。)。14第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v 一个含有子程序调用的代码段的例子一个含有子程序调用的代码段的例子AREA InitAREA Init,CODECODE,READONLYREADONLYENTRYENTRYLDR R0, =0 x3FF5000LDR R0, =0 x3FF5000LDR R1, 0 x0fLDR R1, 0 x0fSTR R1, R0STR R1, R0LDR R0, =0
15、x3F50008LDR R0, =0 x3F50008LDR R1, 0 x1LDR R1, 0 x1STR R1, R0STR R1, R0BL PROC BL PROC ;子程序调用子程序调用PROC PROC ;子程序开始子程序开始MOV PC,LR MOV PC,LR ;从子程序返回从子程序返回ENDEND15第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v 一个数据段的例子一个数据段的例子AREA DataArea, DATA, NOINIT, ALIGN=2AREA DataArea, DATA, NOINIT, ALIGN=2DISPBUFDISPBUFSPACES
16、PACE200200RCVBUFRCVBUFSPACESPACE200200其中其中DATADATA为数据段的标识。为数据段的标识。 16第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.3.4 基于ARM的汇编语言程序举例 举例:连续发送举例:连续发送128128个个ASCIIASCII字符的汇编语言的例子字符的汇编语言的例子 ; ;呼叫子程序呼叫子程序UARTUART b UART b UART ; ;子程序开始子程序开始UARTUART ldr r0, =GPHCON ;ldr r0, =GPHCON ;设置设置GPIO(RxD0,TxD0GPIO(RxD0,TxD0引脚
17、引脚) ) ldr r1, =0 x2afaaaldr r1, =0 x2afaaa str r1, r0 str r1, r0 ldr r0, =GPHUP ldr r0, =GPHUP ldr r1, =0 x7ff ldr r1, =0 x7ff str r1, r0 ; ;GPH10:0 str r1, r0 ; ;GPH10:0禁止上拉禁止上拉 ldr r0, =UFCON0 ;ldr r0, =UFCON0 ;禁用禁用FIFOFIFO ldr r1, =0 x0 ldr r1, =0 x0 str r1, r0 str r1, r0 ldr r0, =UMCON0 ; ldr r0
18、, =UMCON0 ;禁用禁用AFCAFC ldr r1, =0 x0 ldr r1, =0 x0 str r1, r0 str r1, r0 ldr r0, =ULCON0 ; ldr r0, =ULCON0 ;设置线寄存器设置线寄存器 ldr r1, =0 x3 ;ldr r1, =0 x3 ;正常模式正常模式, ,无奇偶校验无奇偶校验, ,一个停止位一个停止位,8,8个数据位个数据位 str r1, r0str r1, r0 ldr r0, =UCON0 ; ldr r0, =UCON0 ;设置设置Uart0Uart0控制器控制器 ldr r1, =0 x245 ;RXldr r1, =
19、0 x245 ;RX边沿触发边沿触发, ,TXTX电平触发电平触发, ,禁用延时中断禁用延时中断, ,使用使用RX RX 错误中断错误中断, , ; ;正常操作模式正常操作模式, ,中断请求或表决模式中断请求或表决模式 str r1, r0str r1, r0 ldr r0, =UBRDIV0 ; ldr r0, =UBRDIV0 ;设置波特率为设置波特率为115200115200 ldr r1, =0 x1a ;int(50700000 / 16 / 115200) - 1 = 26ldr r1, =0 x1a ;int(50700000 / 16 / 115200) - 1 = 26 st
20、r r1, r0 str r1, r0 mov r1, #100 mov r1, #10017第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础DelayDelay sub r1, r1, #0 x1 sub r1, r1, #0 x1 bne Delay bne Delay ;/ ;/开中断开中断 ldr r0, =INTMSKldr r0, =INTMSK ldr r1, r0 ldr r1, r0 and r1, r1, #0 xefffffff and r1, r1, #0 xefffffff str r1, r0 str r1, r0 MOV R5 , #127 ; MOV
21、 R5 , #127 ;设置要打印的字符的个数设置要打印的字符的个数 MOV R1 , #0 x0 ;MOV R1 , #0 x0 ;设置要打印的字符设置要打印的字符LOOP LOOP LDR R3 , =UTRSTAT0 LDR R3 , =UTRSTAT0 LDR R2 , R3 LDR R2 , R3 TST R2 ,#0 x04 ; TST R2 ,#0 x04 ;判断发送缓冲区是否为空判断发送缓冲区是否为空 BEQ LOOP ;BEQ LOOP ;为空则执行下边的语句,不为空则跳转到为空则执行下边的语句,不为空则跳转到LOOPLOOP LDR R0 , =UTXH0 LDR R0 ,
22、 =UTXH0 STR R1 ,R0 ; STR R1 ,R0 ;向数据缓冲区放置要发送的数据向数据缓冲区放置要发送的数据 ADD R1, R1, #1ADD R1, R1, #1 SUB R5 ,R5, #0 x01 ; SUB R5 ,R5, #0 x01 ;计数器减计数器减1 1 CMP R5 ,#0 x0CMP R5 ,#0 x0 BNE LOOP BNE LOOP18第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础主要内容ADS 1.2集成开发环境简介集成开发环境简介 基于基于ARM的汇编语言程序设计的汇编语言程序设计基于基于ARM的硬件启动程序的硬件启动程序基于基于AR
23、M的的C语言与汇编语言混合编程语言与汇编语言混合编程印制电路板制作简介印制电路板制作简介RVDS 2.2 集成开发环境简介集成开发环境简介 19第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础硬件启动程序的工作一般包括:硬件启动程序的工作一般包括:(1 1) 分配中断向量表分配中断向量表(2 2) 初始化存储器系统初始化存储器系统(3 3) 初始化各工作模式下的堆栈初始化各工作模式下的堆栈(4 4) 初始化有特殊要求的硬件模块初始化有特殊要求的硬件模块(5 5) 初始化用户程序的执行环境初始化用户程序的执行环境(6 6) 切换处理器的工作模式切换处理器的工作模式(7 7) 呼叫主应
24、用程序呼叫主应用程序 4.4 基于ARM的硬件启动程序20第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v (1 1) 分配中断向量表分配中断向量表中断中断地址地址复位复位0 0 x00 x00未定义未定义0 0 x04x04软件中断软件中断0 0 x08x08预取中止预取中止0 0 x0Cx0C数据中止数据中止0 0 x10 x10保留保留0 0 x14x14IRQIRQ0 0 x18x18FIQFIQ0 0 x1Cx1CARMARM要求中断向量表必须放置要求中断向量表必须放置在从在从0 0 x0 x0地址开始的连续地址开始的连续3232个字个字节空间内。节空间内。 AREA
25、Init ,CODE, READONLYAREA Init ,CODE, READONLYENTRYENTRYB ResetHandlerB ResetHandlerB UndefHandlerB UndefHandlerB SWIHandlerB SWIHandlerB PreAbortHandlerB PreAbortHandlerB DataAbortHandlerB DataAbortHandlerB BB IRQHandlerB IRQHandlerB FIQHandlerB FIQHandler 中断向量表的程序通常如下所示:中断向量表的程序通常如下所示: 21第第4 4章章 AR
26、MARM系统硬件设计基础系统硬件设计基础v(2 2) 初始化存储器系统初始化存储器系统 对存储系统的初始化操作包括对存储器类型、存储器对存储系统的初始化操作包括对存储器类型、存储器容量、时序以及总线宽度等的配置。容量、时序以及总线宽度等的配置。通常通常FlashFlash和和SRAMSRAM同属于静态存储器类型,可以合同属于静态存储器类型,可以合用同一个存储器端口;用同一个存储器端口;而而DRAMDRAM因为有动态刷新和地址线复用等特性,通因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口;常配有专用的存储器端口;除了存储器外,与网络芯片相关的存储器配置以及除了存储器外,与网络芯片相关
27、的存储器配置以及外接大容量存储卡的配置也在这里进行。外接大容量存储卡的配置也在这里进行。22第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v(3 3) 初始化各工作模式下的堆栈初始化各工作模式下的堆栈 ARM ARM有有7 7种运行状态,每一种状态的堆栈指针寄存器(种运行状态,每一种状态的堆栈指针寄存器(SPSP)都是独都是独立的。程序需要对用到的每一种模式下的立的。程序需要对用到的每一种模式下的SPSP定义一个堆栈地址。定义的定义一个堆栈地址。定义的方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,然后方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,然后给给S
28、PSP赋值。赋值。 ; ;预定义处理器模式常量预定义处理器模式常量USERMODE EQUUSERMODE EQU0 x100 x10FIQMODEFIQMODE EQU EQU0 x110 x11IRQMODEIRQMODE EQU EQU0 x120 x12SVCMODESVCMODE EQU EQU 0 x130 x13ABORTMODE EQU 0 x17ABORTMODE EQU 0 x17UNDEFMODE EQU 0 x1bUNDEFMODE EQU 0 x1bSYSMODE EQU 0 x1fSYSMODE EQU 0 x1fNOINTNOINT EQU EQU0 xc00 x
29、c0InitStacksInitStacksmrsmrsr0,cpsrr0,cpsrbicbicr0,r0,#MODEMASKr0,r0,#MODEMASKorrorrr1,r0,#UNDEFMODE|NOINTr1,r0,#UNDEFMODE|NOINTmsrmsrcpsr_cxsf,r1cpsr_cxsf,r1;/;/未定义模式堆栈未定义模式堆栈ldrldrsp,=UndefStacksp,=UndefStackorrorrr1,r0,#ABORTMODE|NOINTr1,r0,#ABORTMODE|NOINTmsrmsrcpsr_cxsf,r1cpsr_cxsf,r1;/;/中止模式堆栈
30、中止模式堆栈ldrldrsp,=AbortStacksp,=AbortStackorrorrr1,r0,#IRQMODE|NOINTr1,r0,#IRQMODE|NOINTmsrmsrcpsr_cxsf,r1cpsr_cxsf,r1;/;/中断模式堆栈中断模式堆栈ldrldrsp,=IRQStacksp,=IRQStackorrorrr1,r0,#FIQMODE|NOINTr1,r0,#FIQMODE|NOINTmsrmsrcpsr_cxsf,r1cpsr_cxsf,r1;/;/快速中断模式堆栈快速中断模式堆栈ldrldrsp,=FIQStacksp,=FIQStackbicbicr0,r0,
31、#MODEMASK|NOINTr0,r0,#MODEMASK|NOINTorrorrr1,r0,#SVCMODEr1,r0,#SVCMODEmsrmsrcpsr_cxsf,r1cpsr_cxsf,r1;/;/管理模式堆栈管理模式堆栈ldrldrsp,=SVCStacksp,=SVCStackmovmovpc,lr pc,lr LTORGLTORG23第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v(4 4) 初始化有特殊要求的硬件模块初始化有特殊要求的硬件模块 这一部分的设置工作根据具体的系统和用户需求而这一部分的设置工作根据具体的系统和用户需求而定。一般外设初始化可以在系统初始
32、化之后进行。比较定。一般外设初始化可以在系统初始化之后进行。比较典型的硬件模块有典型的硬件模块有LEDLED、时钟模块、看门狗模块等。时钟模块、看门狗模块等。 24第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v(5 5) 初始化用户程序的执行环境初始化用户程序的执行环境可执行程序映像的结构:可执行程序映像的结构: ZI(ZI(初始化为初始化为0 0的可读写数据的可读写数据) )只定义了变量名的全局变量只定义了变量名的全局变量RWRW(可读写数据)可读写数据)定义时带初始值的全局变量定义时带初始值的全局变量RORO(代码和只读数据)代码和只读数据)编译结果编译结果LDR r0,=
33、|Image$RO$Limit| ;LDR r0,=|Image$RO$Limit| ;得到得到RWRW数据源在数据源在ROMROM中的的起始地址中的的起始地址LDR r1,=|Image$RW$Base| ;RWLDR r1,=|Image$RW$Base| ;RW区在区在RAMRAM里的起始地址里的起始地址LDR r3,=|Image$ZI$Base| ;ZILDR r3,=|Image$ZI$Base| ;ZI区在区在RAMRAM里的起始地址里的起始地址CMP r0,r1 ;CMP r0,r1 ;比较它们是否相等比较它们是否相等 BEQ %F1BEQ %F10 CMP r1,r30 CM
34、P r1,r3 LDRCC r2,r0,#4LDRCC r2,r0,#4 STRCC r2,r1,#4STRCC r2,r1,#4 BCC %B0BCC %B01 LDR r1,=|Image$ZI$Limit|1 LDR r1,=|Image$ZI$Limit| MOV r2,#0MOV r2,#02 CMP r3,r12 CMP r3,r1 STRCC r2,r3,#4STRCC r2,r3,#4 BCC %B2BCC %B225第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v(6 6) 切换处理器的工作模式切换处理器的工作模式需要注意的是,在最后阶段才能把模式转换到最终应用
35、程序运行所需要注意的是,在最后阶段才能把模式转换到最终应用程序运行所需的模式,一般是用户模式。内核级的中断使能也可以考虑在这一步进需的模式,一般是用户模式。内核级的中断使能也可以考虑在这一步进行。行。在初始化过程中模式变化过程为:在初始化过程中模式变化过程为:管理模式管理模式 各种特权模式(堆栈初始化阶段)各种特权模式(堆栈初始化阶段) 用户模式用户模式。26第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础v(7 7) 呼叫主应用程序呼叫主应用程序当所有的系统初始化工作完成之后,就需要把程序流程当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。转入主应用程序。最简单的
36、一种情况是:最简单的一种情况是:IMPORT MainIMPORT MainB MainB Main在在ARM ADSARM ADS环境中,还另外提供了一套系统级的呼叫机制环境中,还另外提供了一套系统级的呼叫机制IMPORT _mainIMPORT _mainB _mainB _main_main()_main()是编译系统提供的一个函数,负责完成库函数的初始化和是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到初始化应用程序执行环境,最后自动跳转到main()main()函数,此时要求用函数,此时要求用户主函数的名字必须是户主函数的名字必须是mainma
37、in。27第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础主要内容ADS 1.2集成开发环境简介集成开发环境简介 基于基于ARM的汇编语言程序设计的汇编语言程序设计基于基于ARM的硬件启动程序的硬件启动程序基于基于ARM的的C语言与汇编语言混合编程语言与汇编语言混合编程印制电路板制作简介印制电路板制作简介RVDS 2.2 集成开发环境简介集成开发环境简介 28第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.5.1 C语言与汇编语言混合编程应遵守的规则 在在C C程序和程序和ARMARM汇编程序之间相互调用时必须遵守汇编程序之间相互调用时必须遵守ATPCSATPCS
38、规则规则。ATPCSATPCS规定了规定了一些子程序间调用的基本规则,比如:一些子程序间调用的基本规则,比如:寄存器的使用规则寄存器的使用规则子程序之间通过寄存器子程序之间通过寄存器r0r0r3r3来传递参数,当参数个数多于来传递参数,当参数个数多于4 4个时,使用堆个时,使用堆栈来传递参数。栈来传递参数。在子程序中,使用寄存器在子程序中,使用寄存器r4r4r11r11保存局部变量。保存局部变量。寄存器寄存器r12r12用于保存堆栈指针用于保存堆栈指针SPSP,当子程序返回时使用该寄存器出栈,记作当子程序返回时使用该寄存器出栈,记作IPIP。寄存器寄存器r13r13用作堆栈指针,记作用作堆栈指
39、针,记作SPSP。寄存器寄存器r14r14称为链接寄存器,记作称为链接寄存器,记作LRLR。该寄存器用于保存子程序的返回地址。寄存器该寄存器用于保存子程序的返回地址。寄存器r15r15称为程序计数器,记作称为程序计数器,记作PCPC。 堆栈的使用规则堆栈的使用规则堆栈采用满递减类型(堆栈采用满递减类型(FDFD,Full DescendingFull Descending),),即堆栈通过减小存储器地址即堆栈通过减小存储器地址而向下增长,堆栈指针指向内含有效数据项的最低地址。而向下增长,堆栈指针指向内含有效数据项的最低地址。 参数的传递规则参数的传递规则整数参数的前整数参数的前4 4个使用个使
40、用r0r0r3r3传递,其他参数使用堆栈传递;浮点参数使用传递,其他参数使用堆栈传递;浮点参数使用编号最小且能够满足需要的一组连续的编号最小且能够满足需要的一组连续的FPFP寄存器传递参数寄存器传递参数子程序的返回结果为一个子程序的返回结果为一个3232位整数时,通过位整数时,通过r0r0返回;返回结果为一个返回;返回结果为一个6464位位整数时,通过整数时,通过r0r0和和r1r1返回;依此类推。结果为浮点数时,通过浮点运算部件返回;依此类推。结果为浮点数时,通过浮点运算部件的寄存器的寄存器F0F0、D0D0或或S0S0返回返回29第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础
41、 4.5.2 汇编程序调用C程序的方法 汇编程序调用汇编程序调用C C程序的方法为:首先在汇编程序中使用程序的方法为:首先在汇编程序中使用IMPORTIMPORT伪指伪指令事先声明将要调用的令事先声明将要调用的C C语言函数;然后通过语言函数;然后通过BLBL指令来调用指令来调用C C函数。函数。 例如在一个例如在一个C C源文件中定义了如下求和函数:源文件中定义了如下求和函数:int add(int x,int y)int add(int x,int y) return(x+y); return(x+y); 调用调用add()add()函数的汇编程序结构如下:函数的汇编程序结构如下: IMP
42、ORT add ;IMPORT add ;声明要调用的声明要调用的C C函数函数MOV r0,1MOV r0,1MOV r1,2MOV r1,2BL add ;BL add ;调用调用C C函数函数addadd30第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.5.3 C程序调用汇编程序的方法 C C程序调用汇编子程序的方法为:首先在汇编程序中使用程序调用汇编子程序的方法为:首先在汇编程序中使用EXPORTEXPORT伪指伪指令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后令声明被调用的子程序,表示该子程序将在其他文件中被调用;然后在在C C程序中使用程序中使用e
43、xternextern关键字声明要调用的汇编子程序为外部函数。关键字声明要调用的汇编子程序为外部函数。 例如在一个汇编源文件中定义了如下求和函数:例如在一个汇编源文件中定义了如下求和函数:EXPORT add ;EXPORT add ;声明声明addadd子程序将被外部函数调用子程序将被外部函数调用add ;add ;求和子程序求和子程序addadd ADD r0,r0,r1 ADD r0,r0,r1 MOV pc,lr MOV pc,lr 在一个在一个C C程序的程序的main()main()函数中对函数中对addadd汇编子程序进行了调用:汇编子程序进行了调用:extern int add
44、(int x,int y); /extern int add(int x,int y); /声明声明addadd为外部函数为外部函数void main()void main() int a=1,b=2,c; int a=1,b=2,c; c=add(a,b); / c=add(a,b); /调用调用addadd子程序子程序 31第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.5.4 C程序中内嵌汇编语句 在在C C语言中内嵌汇编语句可以实现一些高级语言不能实现或者高级语言语言中内嵌汇编语句可以实现一些高级语言不能实现或者高级语言不容易实现的功能以及时间紧迫的功能。不容易实现的
45、功能以及时间紧迫的功能。内嵌的汇编器支持大部分内嵌的汇编器支持大部分ARMARM指令和指令和ThumbThumb指令,但是不支持诸如直指令,但是不支持诸如直接修改接修改PCPC实现跳转的底层功能,也不能直接引用实现跳转的底层功能,也不能直接引用C C语言中的变量。语言中的变量。嵌入式汇编语句在形式上表现为独立定义的函数体,其语法格式为:嵌入式汇编语句在形式上表现为独立定义的函数体,其语法格式为:_ _ _asmasm 指令指令; ;指令指令 指令指令 32第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础C程序中内嵌汇编语句举例使能IRQ中断: inline void enable_
46、IRQ(void) int tmp ; _asm /嵌入汇编代码 MRS tmp,CPSR /读取CPSR的值 BIC tmp,tmp,#0 x80 /将IRQ中断禁止位I清零,即允许IRQ中断 MSR CPSR_c,tmp /设置CPSR的值 33第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础字符串复制: #include void my_strcpy(const char*src, char*dst) int ch; _asm loop: #ifndef_thumb /ARM指令版本 LDRB ch,src,#1 STRB ch,dst,#1 #else /Thumb指令版本
47、 LDRB ch,src ADD src,#1 STRB ch,dst ADD dst,#1 #endif CMP ch,#0 BNE loop 34第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础int main(void) const char*a=“Hello world!” char b20 /my_strcpy(a,b); _asm MOV R0,a /设置入口参数 MOV R1,b BL my_strcpy,R0,R1 /调用my_strcpy()函数 printf(“Original string:%sn,”a); /显示my_strcpy()函数字符串复制结果 pr
48、intf(“Copied string:%sn,”b); return(0); 35第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础 4.5.5 基于ARM的C语言与汇编语言混合编程举例 举例:一个向串口不断发送举例:一个向串口不断发送0 0 x55x55的例子。的例子。# #include .incconfig.h /include .incconfig.h /将有关硬件定义的头文件包含进来将有关硬件定义的头文件包含进来unsigned char data; /unsigned char data; /定义全局变量定义全局变量void Main(void)void Main(vo
49、id) Target_Init(); / Target_Init(); /对目标板的硬件初始化对目标板的硬件初始化 Delay(10); /Delay(10); /延时延时 data = 0 x55; /data = 0 x55; /给全局变量赋值给全局变量赋值 while(1) while(1) Uart_Printf(%x,data); / Uart_Printf(%x,data); /向串口送数向串口送数 Delay(10); Delay(10); IMPORT MainIMPORT MainAREA Init ,CODE, READONLY;AREA Init ,CODE, READO
50、NLY;ENTRY ENTRY BL Main BL Main ;跳转到跳转到Main()Main()函数处的函数处的C/C+C/C+程序程序END END ;标识汇编程序结束标识汇编程序结束 启动代启动代码的整码的整体框架体框架 C C语言写语言写的主函数的主函数 36第第4 4章章 ARMARM系统硬件设计基础系统硬件设计基础主要内容ADS 1.2集成开发环境简介集成开发环境简介 基于基于ARM的汇编语言程序设计的汇编语言程序设计基于基于ARM的硬件启动程序的硬件启动程序基于基于ARM的的C语言与汇编语言混合编程语言与汇编语言混合编程印制电路板制作简介印制电路板制作简介RVDS 2.2 集