




已阅读5页,还剩83页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
09 34 1 ARM9嵌入式系统设计基础教程 江苏大学计算机科学与通信工程学院通信工程系陈祖爵E mail chenzujue TEL09 34 2 课程理论教学内容安排 第1章嵌入式系统基础知识第2章ARM体系结构第3章32BitRISC微处理器S3C2410A第4章嵌入式系统的存储器系统第5章嵌入式系统输入 输出设备接口第6章嵌入式系统总线接口第7章嵌入式系统网络接口第8章嵌入式系统软件及操作系统基础第9章ARM汇编语言程序设计基础第10章Bootloader设计基础第11章Linux操作系统基础第12章嵌入式Linux软件设计第13章图形用户接口 GUI 09 34 3 第9章ARM汇编语言程序设计基础 9 1ADS集成开发环境4 329 2ARM汇编伪指令33 499 3ARM的汇编语言结构50 609 4ARM汇编语言程序调试61 749 5ARM汇编语言与C语言混合编程75 87 09 34 4 9 1ADS集成开发环境 ARM应用软件的开发工具根据功能的不同 可以分为编辑软件 编译软件 汇编软件 链接软件 调试软件 嵌入式实时操作系统 函数库 评估板 JTAG仿真器以及在线仿真器等 目前有多家公司可以提供以上不同类型的开发工具 用户采用ARM处理器进行嵌入式系统开发时 选择合适的开发工具可以加快开发进度 节省开发成本 通常将编辑软件 编译软件 汇编软件 链接软件 调试软件 工程管理及函数库等都包含在一起的集成开发环境 IDE 较为常见 也是进行嵌入式系统开发时必不可少的 目前 典型的ARMIDE有STD SoftwareDevelopmentkiT ADS ARMDeveloperSuite Multi2000 Embest HitoolforARM等 09 34 5 9 1 1ADS工具包的组成 ADS是ARM公司推出的集成开发工具包 专用于ARM应用开发和调试的综合性软件 目前常用的版本是1 2 在功能和易用性上比早期的SDT都有提高 是一款功能强大又易于使用的开发工具 ARMADS包含有编译器 链接器 CodeWarriorIDE 调试器 指令集模拟器 ARM开发包和应用库等部分 可以用ADS开发 编译 调试采用包括C C 和ARM汇编语言编写的程序 1 编译器ADS提供多种编译器 以支持ARM和Thumb指令的编译 包含有armcc ARMC编译器 tcc ThumbC编译器 armcpp ARMC 编译器 tcpp ThumbC 编译器 和armasm ARM和Thumb汇编器 09 34 6 2 链接器 Armlink ARM链接器 可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接 生成一个可执行文件 也可以将多个目标文件部分链接成一个目标文件 以供进一步的链接 采用有ARM公司的源程序编辑 汇编及链接工具 针对ARM系列的每一种结构都进行了专门的优化处理 其代码生成工具最终生成的可执行文件最小 可以比其他公司工具套件生成的文件小20 09 34 7 3 CodeWarriorIDE CodeWarriorIDE 集成开发环境 包括工程管理器 代码生成接口 语法敏感编辑器 源文件和类浏览器 源代码版本控制系统接口以及文本搜索引擎等 ADS仅在其PC机版本中集成了该IDE CodeWarriorIDE为管理和开发项目提供了简单多样化的图形用户界面 用户可以使用ADS的CodeWarriorIDE为ARM和Thumb处理器开发用C C 或者ARM汇编语言编写的程序代码 09 34 8 4 调试器 1 调试器类型ADS中包含有3个调试器 分别是ARM扩展调试器AXD 向下兼容的ADW ARMdebuggerforwindows ADU ARMDebuggerforUNIX 和ARM符号调试器armsd Armsd是命令调试工具 用于辅助调试 或者用于其他操作系统平台上 能进行源码级的程序调试 用户可以用C语言或汇编语言编写的代码中进行单步调试 设置断点 查看量值和内存单元的内容 2 调试方式在ARM体系中 可以选择Multi ICE Multi processorin circuitemulator ARMulator或Angel多种调试方式 Multi ICE是ARM公司自己的JTAG在线仿真器产品 不是由ADS提供的 ARMulator是ARM指令集模拟器 集成在ARM调试器AXD中 提供对ARM处理器的指令集的仿真 为ARM和Thumb提供精确模拟 在硬件尚未做好的情况下 在PC机上开发程序代码 利用模拟器方式调试 实现部分调试工作 Angel是ARM常驻在目标机Flash中的监控程序 通过RS 232C与PC机相连 就可以在PC机上对基于ARM架构处理器的目标机进行监控器方式的调试 09 34 9 5 ARM开发包和函数库 ARM开发包由一些底层的例程和库组成 用户可快速开发ARM的应用程序和操作系统 ADS的ARM应用库完善并增强了SDT中的函数库 还包括有用的源码例程 使用ARMADS开发应用程序与使用ARMSDT完全相同 可选择使用Angle驻留模块或JTAG仿真器 目前大部分JTAG仿真器都支持ARMADS ADS提供ANSIC函数库和C 函数库 支持被编译的C和C 代码 用户可把C函数库中的与目标相关的函数作为应用程序中的一部分 重新进行代码的实现 在C函数库中很多函数是独立于其他函数 并与目标硬件没任何依赖关系 用户可根据应用程序的要求 对与目标无关的库函数进行适当的裁剪和利用 09 34 10 Typical安装模式后的ADS工具包 下图是采用Typical安装模式后 在程序栏里看到的ADS工具包组成 其中主要就是CodeWarrior编译器和AXD调试器这两个图形界面开发工具 09 34 11 9 1 2ADS开发工具集 1 命令行开发工具命令行开发工具在实际应用中相对比较广泛 使用它最大的好处就是可以将许多编译命令写在一个脚本文件中 然后只执行该脚本文件就可以让工具自动地完成所有的编译工作命令行中常用的命令如下 1 armcc armcc是ARMC编译器 编译器通过了PlumHallCValidationSuite为ANSIC的一致性测试 armcc将ANSIC编写的程序编译成32位ARM指令代码 在命令控制台环境下 输人命令 C armcc help 可以查看armcc的语法格式以及最常用的一些操作选项 2 armcpp armcpp是ARMC 编译器 它将ISOC 或EC 源码编译成32位ARM指令代码 3 tcc tcc是ThumbC编译器 编译器通过了PlumHallCValidationSuite为ANSI一致性测试 tcc将ANSIC源代码编译成16位的Thumb指令代码 09 34 12 命令行开发工具 4 tcpp tcpp是ThumbC 编译器 它将ISOC 或EC 源码编译成16位Thumb指令代码 armcpp tcc和tcpp的命令行格式与armcc相同 5 armsm armsm是ARM和Thumb的汇编器 它对用ARM汇编语言和Thumb汇编语言写的源代码进行汇编 6 armlink armlink是ARM连接器 该命令即可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接 生成一个可执行文件 也可以将多个目标文件部分链接成一个目标文件 以供进一步的链接 ARM链接器生成的是ELF格式的可执行映像文件 7 armsd armsd是ARM和Thumb的符号调试器 它能够进行源码级的程序调试 用户可以在用C语言或汇编语言写的代码中进行单步调试 设置断点 查看变量值和内存单元的内容 09 34 13 2 GUI开发环境 图形用户界面 graphicuserinterface 简称gui 的大量使用很好的方便了非专业用户的使用 gui应用程序的设计是嵌入式系统设计的一个关键技术 能极大地提高人机交互的效率 ADSGUI开发环境主要包含CodeWarrior和AXD 其中CodeWarrior是用于编译和链接的集成开发工具 而AXD则是支持单步执行 断点设置等功能的集成调试工具 1 CodeWarriorCodeWarriorforARM是一套完整的集成开发工具 充分发挥了ARMRISC指令系统的优势 可加速并简化开发过程的环节 只用集成软件开发环境就能研制出ARM产品 在开发过程中无需离CodeWarrior开发环境 可节省开发时间 将精力投入到代码编写上 CodeWarriorIDE为管理和开发项目提供了简单 多样化的图形用户界面 用户可以使用ADS的CodeWarriorIDE为ARM处理器开发使用C C 或ARM汇编语言的程序代码 CodeWarriorIDE缩短了用户开发项目代码的周期 主要基于两点 一是全面的项目管理功能 二是子函数的代码导航功能 使得用户迅速找到程序中的子函数 09 34 14 GUI开发环境 2 AXD调试器AXD调试器本身是一个软件 用户通过这个软件可以对包含有调试信息的 正在运行的可执行代码进行变量的查看 断点的设置 单步执行等调试操作 在ARM体系中 它有Multi ICE ARMulator和Angel等几种方式 AXD可以在Windows和UNIX下进行程序的调试 它为用C C 和汇编语言的源代码提供了一个全面的Windows和UNIX环境 09 34 15 3 实用程序 ADS提供实用工具来配合前面介绍的命令行开发工具使用 1 fromELF是ARM映像文件转换工具 该工具可以将ELF格式文件转换为各种输出格式的文件 包括PlainBinary BIN格式映像文件 Freescale32bitS recordformat Frees cale32位S格式映像文件 IntelHex32format Intel32位格式映像文件 和Verilog likehexformat Verilog十六进制文件 它也能够为输入映像文件产生代码和数据长度等文本信息 2 armar是ARM库函数生成器 它将一系列ELF格式的目标文件以库函数的形式集合在一起 用户可以把一个库传递给一个链接器 以代替几个ELF文件 这个工具可用于开发库文件 以提供给应用程序员做二次开发 3 Flashdownloader用于把二进制映像文件下载到ARM嵌入式设备上的Flash存储器中 09 34 16 9 1 3CodeWarriorIDE的创建 CodeWarriorIDE提供了一个简单的图形化用户界面用于管理软件项目 支持C C 和ARM的开发 通过实例讲述CodeWarriorIDE的具体使用 1 创建项目工程 1 新建工程 开始 菜单中选择ARMDeveloperSuitev1 2 CodeWarriorforARMDevelope Suite 运行ADS1 2集成开发环境 CodeWarriorforARMDeveloperSuite 选择File New项 在New对话框中 选择Project选项卡 ARMExecutablelmage 在Projectname文本框中输入项目的名称 在Location中输入其存放的位置 见图9 1 2 注意 ADSl 2不支持中文的目录名字 所以新建工程的文件夹向上一直到根目录的所有文件夹的名字都要英文 09 34 17 新建工程 在新建工程对话框中为用户提供了7种可选择的工程类型 1 ARMExecutablelmage由ARM指令代码生成ELF格式可执行映像文件 2 ARMObjectLibrary由ARM指令的代码生成armar格式的目标文件库 3 EmptyProject用于创建一个不包含任何库或源文件的工程 4 MakefilelmporterWizard将VisualC语言的nmake或GNUmake文件转入到CodeWarriorIDE工程文件 5 ThumbARMInterworkinglmage用于由ARM指令和Thumb指令的混和代码生成一个可执行的ELF格式的映像文件 6 ThumbExecutableImage由Thumb指令创建一个ELF格式的映像文件 7 ThumbObjectLibrary由Thumb指令代码生成armar格式的目标文件库 09 34 18 2 选择Debug版本 在新建的工程中 选择Debug版本 生成目录选项每个工程目录都有3种生成目标 Debug包含所有的调试信息 DebugRel包含部分调试信息 Release不包含调试信息的发行版本 09 34 19 3 Post Linker选项 从Edit下拉菜单中选择DebugSetting 弹出图所示对话框 选中TargetSettings项 在Post linker列表框中选中ARMfromELF项 单击OK按钮 这是为生成可执行的代码的初始开关 09 34 20 4 选择要编译的CPU核 如下图所示 单击ARMAssembler 在ArchitectureorProcessor列表框中选择要编译的CPU核 此处以ARM920T为例 09 34 21 ARMCCompiler选项 如下图 单击ARMCCompiler 在ArchitectureorProcessor列表框中选择ARM920T 这是要编译的CPU核 09 34 22 5 设定起始地址 如下图 单击ARMLinker 在Output选项卡中设定程序的代码段地址 以及数据使用的地址 在图9 1 7中的ROBase文本框中填写程序代码存放的起始地址 一般为Flash的起始地址 RWBase文本框中填写数据存放的起始地址 一般为SDRAM的起始地址 09 34 23 6 设置ARMfromELF选项 如下图 即在DebugSettings对话框中单击左栏的ARMfromELF项 在Out putfilename框中设置输出文件名 bin 前缀名可以自己取 在Outputformat列表框中选择Plainbinary 这是设置要下载到F1ash中的二进制文件 下图选择的是test bin 09 34 24 7 保存新建的项目文件 ADSl 2中的基本设置完成后 可以将该新建的空项目文件作为模板保存 首先 要将该项目工程文件改一个合适的名字 如S3C2410ARM mcp等 然后 在ADSl 2软件安装的目录下的Stationary目录下新建一个合适的模板目录名 如S3C2410ARMExecutablelmage 再将刚刚设置完的S3C2410ARM mcp项目文件存放到该目录下即可 这样 就能在图9 1 8中看到该模板 接下来就可以编写C语言或者汇编语言程序 后缀为 s 并添加到这个工程中来 09 34 25 2 对工程进行编译和链接 对前面创建的工程进行编译 链接 可以打开ADS自带的Example进行学习 例如打开示例C ProgramFiles ARM ADSvl 2 Examples asm下的armex mcp工程文件 如下图 09 34 26 对工程进行编译和链接 选择菜单Project Make项对工程进行编译和链接 Make的行为包括以下过程 编译和汇编源程序文件 产生 o对象文件 链接对象文件和库产生可执行映像文件 产生二进制代码 Make之后将弹出Errors Warnings对话框 报告出错和警告情况 编译成功后的显示如图9 1 10所示 注意 左上方表示的错误和警告数目都是0 09 34 27 编译和链接后的结果 Make结束后产生了可执行映像文件 axf文件 这个文件可以载人AXD进行仿真调试 也可以采用fromELF工具将其转换为二进制格式文件 以烧录到嵌人式设备的FlashROM中 或者下载到嵌入式设备的内存中调试运行 09 34 28 9 1 4AXD调试器的使用 AXD是ADS套件中的IDE调试器 打开AXD软件 默认打开的目标是ARMulator方式 这里以ARMulator模拟器方式为例 介绍在AXD中进行代码调试的方法和过程 1 启动AXD 配置CPU环境有两种方式可以启动AXD 一种是在CodeWarrior中编译 链接成功后 选择Project菜单下的Debug就可以自动启动AXD 并同时会将axf映像文件装载到模拟器中 另一种方式就是从 开始 菜单中单击AXDDebugger项启动 09 34 29 2 装入映像文件 在菜单File中选择Loadlmage选项 打开Loadlmage对话框 找到要装载的axf映像文件 单击 打开 按钮 把映像文件装载到目标内存中 在映像文件中有个蓝色的箭头指示当前执行的位置 比如对于armex mcp 打开映像文件后的界面如下图 09 34 30 装入映像文件 如果不能自动装载映像文件 窗口是空白的 则说明在AXD软件中还没加载CPU内核 需手动将CPU内核加载 选择菜单项Option ConfigureTarget 对调试目标进行配置 如图9 1 12所示 从图9 1 12可看出 这里的软件模拟器用的是ARMUL dll驱动程序 选择Configure 弹出ARMulatorConfiguration对话框 如图9 1 13所示 在此对话框加入目标CPU内核 并且选择数据存储模式 小端模式或大端模式 配置结束 再通过File Loadlmage命令装入AXD映像文件即可 09 34 31 3 程序的调试 通过菜单Excute来进行单步执行 断点设置等操作 也可以通过菜单ProcessorViews来观测CPU的寄存器 程序中的变量 内存等值变换情况 09 34 32 ARMulatorConfiguration对话框 09 34 33 9 2ARM汇编伪指令 9 2 1数据常量定义伪指令9 2 2数据变量定义伪指令9 2 3内存分配伪指令9 2 4汇编控制伪指令9 2 5其他常用的伪指令 09 34 34 ARM汇编伪指令 在ARM汇编语言程序里 有一些特殊指令助记符 这些助记符与指令系统的助记符不同 没有相对应的操作码 也就是不会生成机器码 仅仅是在编译器软件中起着格式化的作用 通常称这些特殊指令助记符为伪指令 伪指令在源程序中的作用是为完成汇编程序作各种准备工作的 这些伪指令仅在汇编过程中起作用 一旦汇编结束 伪指令的使命就完成 在ARM的汇编程序中 有如下几种伪指令 数据常量定义伪指令 数据变量定义伪指令 内存分配伪指令及其他伪指令 09 34 35 9 2 1数据常量定义伪指令 数据常量定义伪指令EQU用于为程序中的常量 标号等定义一个等效的字符名称 类似于C语言中的 define EQU语法格式 名称EQU表达式 类型 其中EQU可用 代替 EQU伪指令定义的字符名称 当表达式为32位常量时 可指定表达式的数据类型 有三种类型 CODE16 CODE32和DATA 示例 Data inEQU100 定义标号Data in的值为100AddrEQU0 xff CODE32 定义Addr值为0 xff 32位的ARM指令 09 34 36 9 2 2数据变量定义伪指令 数据变量定义伪指令用于定义ARM汇编程序中的变量 对变量赋值以及定义寄存器的别名等操作 常见的数据变量定义伪指令有如下几种 1 GBLA GBLL和GBLS语法格式 GBLA GBLL或GBLS 全局变量名GBLA GBLL和GBLS伪指令用于定义全局变量 并将其初始化 其中 GBLA用于定义一个全局的数字变量 并初始化为0 GBLL用于定义一个全局的逻辑变量 并初始化F 假 GBLS用于定义一个全局的字符串变量 并初始化为空 以上3条伪指令用于定义全局变量 在整个程序范围内变量名必须唯一 示例 GBLATest1 定义一个全局的数字变量 变量名为Test1GBLLTest2 定义一个全局的逻辑变量 变量名为Test2GBLSTest3 定义一个全局的字符串变量 变量名为Test3 09 34 37 2 LCLA LCLL和LCLS 语法格式 LCLA LCLL或LCLS 局部变量名LCLA LCLL和LCLS伪指令用于定义一个ARM程序中的局部变量 并将其初始化 LCLA伪指令用于定义一个局部的数字变量 并初始化为0 LCLL伪指令用于定义一个局部的逻辑变量并初始化为F 假 LCLS伪指令用于定义一个局部的字符串变量 并初始化为空 以上伪指令用于声明局部变量 在其作用范围内变量名必须唯一 示例 LCLATest4 声明一个局部的数字变量 变量名为Test4 09 34 38 3 SETA SETL和SETS 语法格式 变量名SETA SETL或SETS 表达式变量名为已定义过的全局变量或局部变量 表达式为将要赋给变量的值 伪指令SETA SETL和SETS给一个已定义的全局变量或局部变量赋值 SETA伪指令用于给一个数学变量赋值 SETL伪指令用于给一个逻辑变量赋值 SETS伪指令用于给一个字符串变量赋值 示例Test1SETA0 xaa 将该变量赋值为0 xaaTest2SETL TRUE 将该变量赋值为真Test3SETS Testing 将该变量赋值为 Testing 09 34 39 4 RLIST 语法格式 名称RLIST 寄存器列表 RLIST伪指令可用于对一个通用寄存器列表定义名称 使用该伪指令定义的名称可在ARM指令LDM STM中使用 在LDM STM指令中 列表中的寄存器访问次序为根据寄存器的编号由低到高 而与列表中的寄存器排列次序无关 示例 RegListRLIST R0 R5 R8 R10 将寄存器列表名称定义为RegList 可在ARM指令LDM STM中通过该名称访问寄存器列表 09 34 40 9 2 3内存分配伪指令 内存分配伪指令一般用于为特定的数据分配存储单元 同时完成已分配存储单元的初始化 常见的数据定义伪指令有如下几种 1 DCB标号DCB表达式DCB伪指令分配一片连续的字节存储单元 并用伪指令中指定的表达式初始化 表达式可以为0 255的数字或字符串 DCB也可用等号 代替 2 DCW 或DCWU 标号DCW 或DCWU 表达式DCW或DCWU伪指令分配一片连续的半字存储单元 表达式为程序标号或数字表达式 DCW分配的字是半字对齐的 DCWU分配的字并不严格半字对齐 3 DCD 或DCDU 标号DCD 或DCDU 表达式DCD或DCDU伪指令用于分配一片连续的字存储单元 表达式可以是程序标号或数字表达式 DCD也可用 代替 用DCD分配的字存储单元是字对齐的 而用DCDU分配的字存储单元并不严格字对齐 09 34 41 内存分配伪指令 4 DCFD 或DCFDU 标号DCFD 或DCFDU 表达式DCFD或DCFDU伪指令用于为双精度的浮点数分配一片连续的字存储单元 每个双精度的浮点数占据两个字单元 用DCFD分配的宇存储单元是字对齐的 而用DCFDU分配的字存储单元并不严格字对齐 5 DCFS 或DCFSU 标号DCFS 或DCFSU 表达式DCFS或DCFSU伪指令用于为单精度的浮点数分配一片连续的字存储单元 每个单精度的浮点数占据一个字单元 用DCFS分配的字存储单元是字对齐的 而用DCFSU分配的字存储单元并不严格字对齐 6 DCQ 或DCQU 标号DCQ 或DCQU 表达式DCQ或DCQU伪指令用于分配一片以8字节为单位的连续存储区域 并用伪指令中指定的表达式初始化 用DCQ分配的存储单元是字对齐的 而用DCQU分配的存储单元并不严格字对齐 09 34 42 内存分配伪指令 7 SPACE标号SPACE表达式用于分配一片连续的存储区域并初始化为0 SPACE可用 代替 8 MAPMAP表达式 基址寄存器 定义一个结构化的内存表的首地址 MAP可用 代替 基址寄存器为可选项 当基址寄存器选项不存在时 表达式的值即为内存表的首地址 当该选项存在时 内存表的首地址为表达式的值与基址寄存器的和 MAP伪指令通常与FIELD伪指令配合使用来定义结构化的内存表 9 FIELD标号FIELD表达式定义一个结构化内存表中的数据域 FIELD可用 代替 表达式的值为当前数据域在内存表中所占的字节数 FIELD伪指令常与MAP伪指令配合使用来定义结构化的内存表 MAP伪指令定义内存表的首地址 FIELD伪指令定义内存表中的各个数据域 注意 MAP和FIELD伪指令仅用于定义数据结构 并不实际分配存储单元 09 34 43 9 2 4汇编控制伪指令 用于控制汇编程序的执行流程 常用的汇编控制伪指令包括以下几条 1 IF ELSE ENDIFIF逻辑表达式指令序列1ELSE指令序列2ENDIFIF ELSE ENDIF伪指令能根据条件的成立与否决定是否执行某个指令序列 当IF后面的逻辑表达式为真 则执行指令序列1 否则执行指令序列2 2 WHILE WENDWHILE逻辑表达式指令序列WEND伪指令根据条件的成立与否决定是否循环执行指令序列 当WHILE后面的逻辑表达式为真 则执行指令序列 该指令序列执行完后 再判断逻辑表达式的值 若为真则继续执行 一直到逻辑表达式为假 09 34 44 汇编控制伪指令 3 MACRO MENOMACRO 标号宏名 参数1 参数2 指令序列MENDMACRO MEND伪指令将一段代码定义为一个整体 程序中通过宏指令多次调用该段代码 标号在宏指令被展开时 标号会被替换为用户定义的符号 宏指令可用一个或多个参数 宏指令被调用时 参数被相应的值替换 宏指令的使用方式和功能与子程序相似 子程序节省存储空间并提高运行速度 但需要保护现场 在代码较短且需传递参数较多时 可使用宏指令 MACRO和MEND间的指令序列称宏定义体 宏定义体的第一行应声明宏的原型 含宏名 参数 源程序编译时 将宏调用展开 用宏定义中的指令序列代替程序中的宏调用 并将实际参数的值传递给宏定义中的形式参数 MACRO MEND伪指令可以嵌套使用 4 MEXITMEXITMEXIT用于从宏定义中跳转出去 09 34 45 9 2 5其他常用的伪指令 还有一些其他的伪指令 在汇编程序中经常会被使用 主要包括AREA ALIGN CODEl6 CODE32 ENTRY END EXPOR 或GLOBAL IMPORT EXTERN GET 或INCLUDE INCBIN RN ROUT等 1 AREAAREA段名属性1 属性2 AREA定义一个代码段或数据段 段名若以数字开头 需用 括起来 如 1 test 属性段表示该代码段 或数据段 的相关属性 常用的属性如下 CODE属性 用于定义代码段 默认为READONLY DATA属性 用于定义数据段 默认为READWRITE READONLY属性 指定本段为只读 代码段默认为READONLY READWRITE属性 指定本段为可读可写 数据段的默认属性为READWRITE ALIGN属性 使用方式为ALIGN表达式 默认时 ELF 可执行连接文件 代码段和数据段按字对齐 表达式取值为0 31 相应的对齐方式为2表达式次方 COMMON属性 该属性定义一个通用的段 不包含任何的用户代码和数据 各源文件中同名的COMMON段共享同一段存储单元 一个汇编语言程序至少包含一个段 程序长时 可分多个代码段和数据段 09 34 46 常用伪指令 2 ALIGNALIGN 表达式 偏移量 ALIGN伪指令可通过添加填充字节的方式 使当前位置满足一定的对齐方式 其中 表达式的值用于指定对齐方式 可能的取值为2的幂 如1 2 4 8 16等 若未指定表达式 则将当前位置对齐到下一个字的位置 偏移量也为一个数字表达式 若使用该字段 则当前位置的对齐方式为 2的表达式次幂 偏移量 3 CODE16和CODE32CODE16 或CODE32 CODE16伪指令通知编译器 其后的指令序列为16位的Thumb指令 CODE32伪指令通知编译器 其后的指令序列为32位的ARM指令 09 34 47 常用伪指令 4 ENTRYENTRYENTRY伪指令用于指定汇编程序的人口点 在一个完整的汇编程序中至少要有ENTRY 也可以有多个 当有多个ENTRY时 程序的真正人口点由链接器指定 但在源文件里最多只能有一个ENTRY 也可以没有 5 ENDENDEND用于通知编译器已经到了源程序的结尾 通常放在程序的最后一行 6 EXPORT 或OBAL EXPORT标号 WEAK EXPORT伪指令用于在程序中声明一个全局的标号 该标号可以在其他的文件中引用 EXPORT可用GLOBAL代替 标号在程序中区分大小写 WEAK 选项声明其他的同名标号优先于该标号被引用 09 34 48 常用伪指令 7 IMPORTIMPORT标号 WEAK 用于通知编译器要使用的标号在其他的源文件中定义 要在当前源文件中引用 无论当前源文件是否引用该标号 该标号均会被加入到当前符号表中 8 EXTERNEXTERN标号 LWEAK 用于通知编译器要使用的标号在其他的源文件中定义 要在当前源文件中引用 如果当前源文件实际并未引用该标号 该标号就不会被加入到当前源文件的符号表中 9 GET 或INCLUDE GET文件名用于将一个源文件包含到当前的源文件中 并将被包含的源文件在当前位置进行汇编处理 可使用INCLUDE代替GET 汇编程序中常用的方法是在某源文件中定义一些宏指令 用EQU定义常量的符号名称 用MAP和FIELD定义结构化的数据类型 然后用GET伪指令将这个源文件包含到其他的源文件中 使用方法与C语言中的include相似 09 34 49 常用伪指令 10 INCBININCBIN文件名用于将一个目标文件或数据文件包含到当前的源文件中 被包含的文件不作任何变动地存放在当前文件中 编译器从其后开始继续处理 11 RN名称RN表达式用于给一个寄存器定义一个别名 这种方式可以方便程序员记忆该寄存器的功能 其中 名称为给寄存器定义的别名 表达式为寄存器的编码 12 ROUT 名称 ROUT用于给一个局部变量定义作用范围 在程序中若未使用该伪指令 局部变量的作用范围为所在的AREA 而使用ROUT后 局部变量的作用范围在当前ROUT和下一个ROUT之间 09 34 50 9 3ARM的汇编语言结构 9 3 1ARM汇编语言程序结构9 3 2ARM汇编语言的语句格式9 3 3基于Windows下ADS的汇编语言程序结构9 3 4基于Linux下GCC的汇编语言程序结构 09 34 51 9 3 1ARM汇编语言程序结构 在ARM Thumb 汇编语言程序中 以相对独立的指令或数据序列的程序段为单位组织程序代码 段可以分为代码段和数据段 代码段的内容为执行代码 数据段存放代码运行时需要用到的数据 一个汇编程序至少应该有一个代码段 也可以分割为多个代码段和数据段 多个段在程序编译链接时最终形成一个可执行的映像文件 可执行映像文件通常由以下几部分构成 一个或多个代码段 代码段的属性为只读 零个或多个包含初始化数据的数据段 数据段的属性为可读 写 零个或多个不包含初始化数据的数据段 数据段的属性为可读 写 09 34 52 代码段的汇编例子 AREAInit CODE READONLYENTRYStartLDRR0 0 x3FF5000LDRR1 0 xFFSTRR1 R0 END在汇编语言程序中 用AREA定义一个段 并说明所定义段的相关属性 ENTRY伪指令标识程序的入口点 程序末尾为END伪指令 通常每一个汇编程序段都必须有一条END伪指令 以指示代码段的结束 下面是一个数据段的小例子 AREADATAAREA DATA BIINIT ALLGN 2DISPBUFSPACE200RCVBUFSPACE200 DATA数据段标识 SPACE分配200字节的存储单元 并初始化为0 09 34 53 9 3 2ARM汇编语言的语句格式 1 基本语句格式ARM和Thumb汇编语言的语句格式为 标号 指令或伪指令 注释 规则 语句太长 可分若干行书写 在行末用 来标识 指令助记符可全部用大写或小写 但不能在一条指令中大 小写混用 2 汇编语言程序中常用的符号在汇编语言程序设计中 可以使用各种符号代替地址 变量和常量等 以增加程序的可读性 以下为符号命名的约定 符号名不应与指令或者伪指令同名 符号在其作用范围内必须唯一 符号区分大小写 同名的大 小写符号被视为两个不同的符号 自定义的符号名不能与系统保留字相同 09 34 54 程序中的常量和变量 3 程序中的常量程序中的常量是指其值在程序的运行过程中不能被改变的量 ARM和Thumb汇编程序所支持的常量有逻辑常量 数字常量和字符串常量 数字常量一般为32位的整数 无符号常量取值范围为0 232 l 有符号常量取值范围为 231 231 1 逻辑常量只有两种取值 真或假 字符串常量为一个固定的字符串 一般用来提示程序运行时的信息 4 汇编语言程序中的变量程序中的变量是指其值在程序的运行过程中可以改变的量 ARM和Thumb汇编程序所支持的变量包括逻辑变量 数字变量和字符串变量 逻辑变量用于在程序的运行中保存逻辑值 真或假 数字变量用于在程序的运行中保存数字值 但数字值的大小不应超出数字变量所能表示的范围 字符串变量用于在程序的运行中保存一个字符串 但字符串的长度不应超出字符串变量所能表示的范围 09 34 55 5 程序中的变量代换 程序中的变量可通过代换操作取得一个常量 代换操作符为 如 在数字变量前面 编译器会将该数字变量的值转换为十六进制的字符串 并将该十六进制的字符串代换 后的数字变量 如果 在逻辑变量前面 编译器会将该逻辑变量代换为它的取值 真或假 如果 在字符串变量前面有一个代换操作符 编译器会将该字符串变量的值代换 后的字符串变量 示例 LCLSY1 定义局部字符串变量Y1和Y2LCLSY2Y1SETS WORLD Y2SETS HELLO Y1 字符串变量Y2的值为 HELLO WORLD 09 34 56 9 3 3基于Windows下ADS的汇编语言程序结构 ADS环境下的ARM汇编语言程序结构与其他环境下的汇编语言程序结构大体相同 整个程序也是以段为单元来组织代码 段可分为代码段和数据段 代码段的内容为执行代码 数据段存放代码运行时所需的数据 整个程序至少有1个代码段 只读属性 数据段的属性为可读 写 但是语法规则上有其独自的特点 现将其语法规则总结如下 所有标号必须在一行的顶格书写 其后不要添加冒号 所有的指令均不能顶格写 大小写敏感 可以全部大写或全部小写 但不能大小写混合使用 注释使用分号 09 34 57 ADS的汇编语言程序结构举例 以一个简单的汇编程序文件testl s为例 对以上规则作相应的介绍 AREAARMex CODE READONLY AREA定义段 段名Init 代码段 只读ENTRY 伪指令 第一条指令的人口Start 标号 必须顶格 MOVr0 10MOVr1 3ADDr0 r0 r1 r0 r0 r1 以下3行为软件中断 用来停止ADSStopMOVr0 0 x18 软件异常中断响应LDRr1 0 x20026 ADP停止运行 应用退出SWI0 x123456 ARM半主机软件中断END 每一个汇编文件都要以END结束对于上例程序 将test1 s添加到Coderwarrior工程文件中 用Make即可完成编译 链接 09 34 58 9 3 4基于Linux下GCC的汇编语言程序结构 Linux下GCC的汇编语言结构与其他环境下的汇编语言结构相似 整个程序都可以是程序段为单位组织代码 但是在语言规则上与ADS环境下的ARM汇编语言规则有明显的区别 将Linux下GCC的汇编语言下的汇编语言规则总结如下 所有标号必须在一行的顶格书写 并且其后必须添加冒号 所有的指令均不能顶格写 大小写敏感 可以全部大写或全部小写 但不能大小写混合使用 注释使用符号 注释的内容由 号起到此行结束 注释可以在一行的顶格书写 09 34 59 GCC的汇编语言程序结构举例 以一个简单的汇编程序test2 s为例 对以上规则作相应的介绍 text 表示是只读代码段 start globalstart start作为链接器来使用globalmain main函数bmain 跳转到main函数main movro 0 r0 0ldrr1 1 r1 1Addop addr2 r1 r0 r2 r1 r0movpc lr 程序结束 交出对CPU的控制权end 09 34 60 GCC的汇编语言程序说明 在桌面Linux环境下 用arm linux gcc可对其进行交叉编译和链接 arm linux gcctest2 s otest 但要注意 不能用gcc来编译 因为gcc是支持Intel386系列CPU的 而这里的test2 s是ARMCPU的汇编程序 在Linux环境下 也用gcc arm linux gcc编译器来生成相应的 s汇编程序文件 gcc Sfilename c 这样就会生成filename s 这里的参数 S表示只进行预处理 编译 到生成 s为止 而不进行汇编 程序计数器PC是寄存器r15的别名 链接寄存器1r是寄存器r14的别名 当用b指令调用main函数过程时 main函数的返回地址PC将自动存放到1r中 所以将lr的值放到PC中实际就是函数返回 指令 ldaregister expression 的作用是将32位的立即数存放到寄存器中 而MOV和MVN指令一般只用于传送8 24位的立即数 09 34 61 9 4ARM汇编语言程序调试 9 4 1ADS软件模拟环境下的程序调试9 4 2ADS硬件仿真器环境下的程序调试9 4 3ADSWiggler调试电缆环境下的程序调试9 4 4Linux环境下的gdb程序调试 09 34 62 ARM汇编语言程序调试 无论进行嵌入式系统软件开发还是硬件电路设计 调试永远是不可缺少的 非常重要的一个环节 其中 嵌入式软件的调试不同于普通的软件调试 因为开发程序的平台 通用是i386平台 和目标运行的平台 如ARM 是不同的 通常嵌入式系统的调试方法和类型有很多种 最为常见的包括软件模拟调试 硬件仿真器在线调试 Wiggler电缆调试和Linux环境下的gdb程序调试 09 34 63 9 4 1ADS软件模拟环境下的程序调试 ADS软件模拟调试是利用ARMUL dll提供的一个软ARM内核 其调试工具和待调试的嵌入式软件都在主机上运行 由主机提供一个模拟的目标运行环境 可以进行语法和逻辑上的调试 它的优点是简单方便 不需要嵌入式目标板 软件的调试功能较强 缺点是功能有限 不能进行实时联机调试 具体使用9 1 4小节已介绍过 这里不再赘述 09 34 64 9 4 2ADS硬件仿真器环境下的程序调试 在ADS环境下利用JTAG硬件仿真器可以实现联机调试 即在线调试嵌入式设备的Flash中的程序或者SDRAM中的程序 仿真器与目标板通过仿真头连接 与主机有串口 并口 网口或USB接口等连接方式 由于仿真器自成体系 因此调试时既可以连接目标板 也可以不连接目标板 当然 仿真器的价格也相对比较贵 一般在程序的前期开发 通常让程序只在SDRAM中调试运行 最后才下载到Flash中进行调试运行 因为首先要用专门的Flash烧录软件将程序下载到Flash中去 所以其速度慢 操作复杂 同时程序在Flash中运行和调试的速度也比较慢 而且对Flash的频繁擦写会缩短Flash的使用寿命 09 34 65 ADS硬件仿真器环境下的程序调试 ARM仿真器是通过内部硬件实现PC机并口协议到串行JTAG协议的转换 利用高速JTAG串行扫描链 通过调试通信通道 DCC 连接ARM核心内嵌的名为 Embedded ICE 的调试逻辑 调试逻辑实时监测ARM核心的寄存器 数据总线和地址总线 调试器设置Breakpoint及Watchpoint 后程序在ARM内核全速运行 调试逻辑实时监测地址与数据总线 并与预设值比较 在吻合时产生异常中断通知内核并把控制权交给调试器 这样 在程序全速运行时 可以在断点处停止 也可以设置条件断点 条件观察断点等 而且又不占用CPU时间及内存资源 有些仿真器支持多个ARM处理器以及混合结构核心 DSP及FPGA等 的在线调试 Multi ICE是由ARM公司推出的官方仿真器 主要是为了配合ADS通过JTAG接口对ARM器件进行调试 广义说 Multi ICE应该包含Multi ICEserver这个软件和Multi ICE仿真器硬件 软件作为调试代理 接收调试器发来的信息 并转发到硬件 由硬件和目标ARM内核上的调试部件通信 再将信息返回 由于软件采用了RDI的接口 因此可以在支持RDI接口的调试器里进行调试 比如AXD IAR的调试器 09 34 66 1 Multi ICEserver软件的安装 Multi ICEserver软件可以在网上找到 当前的最新版本为2 2 6安装完成后 会产生如下图所示文件 09 34 67 2 运行Multi ICEserver 硬件正确连接后 运行Multi ICEserver 会用自动配置连接目标器件 可在Settings菜单下选择配置的方式 一般选择Atuo Configure即可 正确连接到ARM内核的嵌入式目标板 显示下图 说明和PC机成功链接 下图的方框即代表所找到的ARM内核 ARM920T表示检测的ARM类型 绿色表示未连接调试软件 内核名称左边有一个带方括号的文字 其含义如下 X 表示被调试的处理器类型未知或者没有和调试软件连接 S 表示被调试的处理器处于停止状态 已经和调试软件连接成功 D 表示被调试的处理器处于下载程序的状态 R 表示被调试的处理器处于运行状态 09 34 68 3 配置ADS以支持JTAG仿真器 启动ADS的调试器AXD后 从Optiong菜单中选择ConfigureTarget 在弹出的对话框中选择Multi ICE 如果没有此项 则需要将驱动添加到对话框中 单击按钮 以添加对的支持 添加完后 还要注意配置 使用Configure按钮 ICE和ADS的链接参数 如下图 单击OK按钮 Multi ICEserver就与AXD成功地链接到一起了 下面的工作就是把程序下载到RAM中 并使用ADS进行调试 可参阅ADS有关文档 09 34 69 9 4 3ADSWiggler调试电缆环境下的程序调试 Wiggler调试电缆实际上就是一个简易的JTAG仿真器 它也支持ADS集成开发环境和在线联机调试 支持单步 全速及断点等调试功能Multi ICE一头采用标准20脚的JTAG接口 与嵌入式目标板相连 另一头采用标准25针并口与PC机连接 如下图 09 34 70 1 WigglerJTAG调试电缆的驱动安装 要使用WigglerJTAG调试电缆来调试ARM处理器 除了ADS1 2集成开发环境外 还需要安装一个ARM调试代理 一般使用H JTAG软件 H JTAG软件的特点如下 支持ARM7 ARM9 支持自动检测和手动指定内核 使用RDI接口 支持SDT2 51 ADS1 2 REALVIEW和IAR集成开发环境 支持2个硬件断点或数量不限
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 环境监测行业智能化转型中的数据质量控制与系统集成报告
- 广西数学对口考试试题及答案
- 讯强全检考试试题及答案
- 2025年山西省教师职称考试(语文)(小学)综合试题及答案
- CN222977476U 一种上装卧轴偏心半球阀 (亿众阀门有限公司)
- 育儿手册试题及答案
- 政府如何发展新质生产力
- CN120107368B 一种移动机器人全局重定位方法、系统、装置及介质 (千巡科技(深圳)有限公司)
- 高端装备领域的新质生产力
- 2025年林业应用试题及答案
- 福建省福州市2024-2025学年高三上学期8月第一次质量检测试题 英语 含答案
- 2024年中国高筋雪花粉市场调查研究报告
- 仓储物流安全培训课件
- 安徽省皖江名校2024-2025学年高一上学期12月联考英语试题(含答案无听力原文及音频)
- 洒水降尘合同范例
- 《妇产科学》课件-7.2.3死胎
- 烧伤手术护理
- 气管套管脱管的应急处理
- 吊杆锚头维护施工方案
- 吊装作业安全会议
- 慢性化脓性中耳炎护理查房
评论
0/150
提交评论