AXD 例子详解ARMLinker
ARM实验指导
ADS 集成开发环境及EasyJTAG 仿真器应用ADS 集成开发环境是ARM 公司推出的ARM 核微控制器集成开发工具,英文全称为ARM Developer Suite,成熟版本为ADS1.2。
ADS1.2 支持ARM10 之前的所有ARM 系列微控制器,支持软件调试及JTAG 硬件仿真调试,支持汇编、C、C++源程序,具有编译效率高、系统库功能强等特点,可以在Windows98、Windows XP、Windows2000 以及RedHat Linux上运行。
这里将简单介绍使用ADS1.2 建立工程,编译连接设置,调试操作等等。
最后还介绍了基于LPC2100 系列ARM7 微控制器的工程模板的使用,EasyJTAG 仿真器的安装与使用。
一、ADS 1.2 集成开发环境的组成ADS 1.2 由6 个部分组成,如表1 所示。
表1 ADS 1.2 的组成部分由于用户一般直接操作的是CodeWarrior IDE 集成开发环境和AXD 调试器,所以这一章我们只介绍这两部分软件的使用,其它部分的详细说明参考ADS 1.2 的在线帮助文档或相关资料。
1. CodeWarrior IDE 简介ADS 1.2 使用了CodeWarrior IDE 集成开发环境,并集成了ARM 汇编器、ARM 的C/C++编译器、Thumb 的C/C++编译器、ARM 连接器,包含工程管理器、代码生成接口、语法敏感(对关键字以不同颜色显示)编辑器、源文件和类浏览器等等。
CodeWarrior IDE 主窗口如图1所示。
2. AXD 调试器简介AXD 调试器为ARM 扩展调试器(即ARM eXtended Debugger),包括ADW/ADU 的所有特性,支持硬件仿真和软件仿真(ARMulator)。
AXD 能够装载映像文件到目标内存,具有单步、全速和断点等调试功能,可以观察变量、寄存器和内存的数据等等。
AXD 调试器主窗口如图2 所示。
ARM知识点讲解详解(word文档物超所值)
ARM知识点讲解详解1、ARM处理器工作模式有几种?各种工作模式下分别有什么特点?ARM 处理器有7种工作模式,这7种模式及其特点是:快速断模式(fiq)支持高速数据传输或通道处理,外部断fiq信号有效且CPSR的F=0进入。
断模式(irq)用于通用断处理,外部断irq信号有效CPSR的I=0进入。
管理员模式(svc)- 操作系统的保护模式,复位、软件断进入。
主要用于SWI(软件断)和OS(操作系统)。
这个模式有额外的特权,允许你进一步控制计算机。
止模式(abt)- 支持虚拟内存和/或内存保护预取指令止/数据止进入未定义模式(und)-支持硬件协处理器的软件仿真(浮点、向量运算)未定义指令进入系统模式(sys)- 支持操作系统的特殊用户模式(运行操作系统任务)用户模式(usr)正常的程序执行模式,此模式应用程序不能访问受操作系统保护的资源,不能改变模式,除非异常发生。
2、ARM处理器总共有多少个寄存器,这些寄存器按其在用户编程的功能是如何划分的?这些寄存器在使用各有何特殊之处?答:ARM微处理器共有37个32位寄存器,其31个为通用寄存器,6个为状态寄存器。
31个通用寄存器根据其编程特点可分为如下几种类型:1、不分组寄存器R0-R7 为所有模式共享2、分组寄存器R8-R12R8_fiq-R12_fiq: FIQ模式下的寄存器R8-R12:其它模式共享3、分组寄存器R13-R14分为6组,用户、系统一组,其他每种模式一组。
R13_<mode>通常用作堆栈指针SP,R14_<mode>通常用作子程序链接寄存器,当进入子程序时,常用来保存PC的返回值其,mode为以下几种模式之一:usr、fiq、irq、svc、abt、und。
4、程序寄存器R15(PC)所有模式共享6个状态寄存器:一个CPSR当前程序状态寄存器,保存当前程序状态。
五个程序状态备份寄存器SPSR(svc,abt,und,irq,frq),只有在异常模式下,才能被访问;各异常模式都拥有属于自己的SPSR,当发生异常时, SPSR用来保存CPSR的值,从异常退出时则可由SPSR来恢复CPSR。
ARM 关于地址重映射
关于地址重映射1、通俗解释ARM芯片的地址重映射映射就是一一对应的意思。
重映射就是重新分配这种一一对应的关系。
我们可以把存储器看成一个具有输出和输入口的黑盒子。
如下图所示,输入量是地址,输出的是对应地址上存储的数据。
当然这个黑盒子是由很复杂的半导体电路具现的,具体的实现的方式我们现在不管。
存储单位一般是字节。
这样,每个字节的存储单元对应一个地址,当一个合法地址从存储器的地址总线输入后,该地址对应的存储单元上存储的数据就会出现在数据总线上面。
图1普通的单片机把可执行代码和数据存放到存储器中。
单片机中的CPU从储器中取指令代码和数据。
其中存储器中每个物理存储单元与其地址是一一对应而且是不可变的。
如下图,CPU读取0x00000000地址上存储单元的过程。
图 2ARM比较复杂。
ARM芯片与普通单片机在存储器地址方面的不同在于:ARM 芯片中有些物理存储单元的地址可以根据设置变换。
就是说一个物理存储单元现在对应一个地址,经过设置以后,这个存储单元就对应了另外一个地址了。
图3是随意举了个例子(不要与ARM芯片对应),旨在说明地址重映射的过程。
图3表示把 0x00000000地址上的存储单元映射到新的地址0x00000007上。
CPU 存取0x00000007就是存取0x00000000上的物理存储单元。
图 3下面图4,图5是对ARM芯片的两种地址重映射方式的图示。
假设我们的应用程序存放在外扩 FLASH当中,那么应用程序的异常向量表就存放在0x80000000起始的64个(其中有32个存放异常向量)物理存储单元中。
但是ARM核发生异常(中断)后是从 0x00000000~0x0000003F地址范围取异常向量的。
所以要把0x80000000~0x8000003F范围内的存储单元重新映射到0x00000000~0x0000003F地址范围上。
以后CPU存取0x00000000~0x0000003F地址就是存取 0x80000000~0x8000003F范围内的存储单元。
AXD使用
step6. Load image from file: test.bin,加载要烧入的二进制文件,并在对话框中设好缓存address.
step7. 点run/step/Run to Cursor: 蓝色光标总是在Disassembly窗口中,而不是在我想要的.C文件中指示程序run的进度,并且遇到断点都没有停过。
整个过程就是这样子的,不知道step7的这些现象的原因是为什么啊?请高手们指教。。。。。。谢谢了
首先要谢谢一下twentyon不行。我现在把我的整个操作流程写下来,你看看有什么不对的地方?我写的是基于JTAG仿真器和ADS的flash烧写程序。
step1. 打开Multi-ICE Server : 探测到[X] ARM7TDMI
step2. 双击AXD Debugger: 出现‘Default-1-2-0-0.ses’could not be loaded, 我点确定;出现‘Load Session’,我点取消 (我一直都不太明白这个session的东西是用来做什么的?)
step4. 打开Command Line Interface: Debug> obey .../***.txt :配置特殊寄存器
step5. Load image: FlashProgram.axf,出来的是Disassembly窗口,我自己在file框中点开main.c文件,并在这个主程序中设置了几个断点。
ARM指令集解析
算术指令
实现两个32位数据的加法、减法操作 1.ADD——加法指令 ADD{<cond>}{S}Rd,Rn,operand2 功能:将寄存器Rn的值与operand2操作 数相加,并将结果存放在Rd寄存器中 ADD R0,R1,R2 ADD R0,R1,#5 ADD R0,R1,R2,LSL #2
算术指令
5.RSB——逆向减法指令 RSB{<cond>}{S}Rd,Rn,operand2 功能:将operand2操作数减去寄存器Rn 的值,并将结果存放在Rd寄存器中 RSB R0,R1,R2 RSB R0,R1,#5 RSB R0,R1,R2,LSL #2
算术指令
6.RSC——带借位的逆向减法指令 RSC{<cond>}{S}Rd,Rn,operand2 功能:将operand2操作数减去寄存器Rn 的值,再减去CPSR中的C条件标志位的 反码,并将结果存放在Rd寄存器中 RSC R0,R1,R2
数据传送指令
将一个寄存器中的数据传送到另一个寄存器, 或者将一个立即数传送寄存器 1.MOV指令 MOV {<cond>}{S} Rd,operand2 功能:将源操作数operand2传送到目的寄存器 Rd中 MOV R1,R0 MOV PC,R14 MOV R1,R0,LSL #3 MOV R0,#5
数据传送指令
2.MVN指令 MVN {<cond>}{S} Rd,operand2 功能:将源操作数operand2按位取反后 传送到目的寄存器Rd中 MVN R0,#5 MVN R1,R2
移位操作
将寄存器中的内容进行指定位数的左移 右移 1.LSL——逻辑左移 Rm,LSL<opl> 功能:将寄存器Rm中的内容进行逻辑左 移,左移位数为操作数opl,低位补零 MOV R0,R1,LSL #1
ARM指令集详解(超详细带实例)
ARM指令集详解(超详细带实例)算术和逻辑指令ADC : 带进位的加法(Addition with Carry)ADC{条件}{S} dest, op 1, op 2dest = op_1 + op_2 + carryADC 将把两个操作数加起来,并把结果放置到目的寄存器中。
它使用一个进位标志位,这样就可以做比32 位大的加法。
下列例子将加两个128 位的数。
128 位结果: 寄存器0、1、2、和3第一个128 位数: 寄存器4、5、6、和7第二个128 位数: 寄存器8、9、10、和11。
ADDS R0, R4, R8 ; 加低端的字ADCS R1, R5, R9 ; 加下一个字,带进位ADCS R2, R6, R10 ; 加第三个字,带进位ADCS R3, R7, R11 ; 加高端的字,带进位如果如果要做这样的加法,不要忘记设置S 后缀来更改进位标志。
ADD : 加法(Addition)ADD{条件}{S} dest, op 1, op 2dest = op_1 + op_2ADD 将把两个操作数加起来,把结果放置到目的寄存器中。
操作数1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值:ADD R0, R1, R2 ; R0 = R1 + R2ADD R0, R1, #256 ; R0 = R1 + 256ADD R0, R2, R3,LSL#1 ; R0 = R2 + (R3 1)加法可以在有符号和无符号数上进行。
AND : 逻辑与(logical AND)AND{条件}{S} dest, op 1, op 2dest = op_1 AND op_2AND 将在两个操作数上进行逻辑与,把结果放置到目的寄存器中;对屏蔽你要在上面工作的位很有用。
操作数 1 是一个寄存器,操作数2 可以是一个寄存器,被移位的寄存器,或一个立即值: AND R0, R0, #3 ; R0 = 保持R0 的位0和1,丢弃其余的位。
ARM ADS中的AXD 调试经验集锦(很实用的)
ARM ADS中的AXD 调试经验集锦1、如何设置AXD连接的Target。
在菜单的Configure Target…选项中可以设置。
一般选择MutiIce或者ARMUL两种。
ARMUL是一种ARM的模拟器。
一般的算法或者一些无需和硬件中断等设备打交道的程序都可以通过这个进行调试。
使用上非常简单。
我们一般上板子进行调试都是通过MutiICE来进行。
在刚刚安装了系统的时候,菜单中没有MutiICE,需要我们手动添加:点击ADD按钮,然后在弹出的文件浏览中,选择“C:\Program Files\ARM\Multi-ICE\Muti-ICE.dll”(默认安装的话)。
然后点击“确定”。
这样就把MutiICE的调试接口安装上了。
2、如何保存当前的调试现场。
我们在调试过程中,经常需要在不同的地方设置断点、设置Watchpoint或者打开很多source文件。
但是,一旦我们关闭了AXD,所有的工作都白费了。
当我们再次打开AXD后,我们得到的仍然是没有任何断点、只打开一个entry文件的调试环境。
这里介绍一种方法可以自动保存上一次的调试现场(寄存器的数据都是保存的)。
Options->General tab. 这里确认Save and load default sessions 选项是选中的。
然后打开Session File,确保Rselect Target和Reload images 选项是选中的。
在设置保存后,我们在关闭AXD后,再次启动,就会自动加载上次的image,恢复寄存器了。
如果需要保存多个现场,那么就在设置保存后,在File菜单中选择Save Session来进行保存。
不过注意,保存的路径中不能有空格和特殊字符。
最好保存在ClearCase上。
在需要恢复现场的时候,只需要Load Session就一切OK。
你以前辛辛苦苦设置的断点、 Watchpoint全都回来了。
3、不能设置断点,怎么办?不能设置断点时,我仅知有几种解决方案,这里列举一下:A:清空CPU的Vector Catch 。
arm汇编语言例子
arm汇编语言例子ARM汇编语言是一种低级语言,用于编写底层程序和嵌入式系统。
它是一种基于寄存器的体系结构,广泛应用于移动设备、嵌入式系统和嵌入式控制器等领域。
下面是十个符合要求的ARM汇编语言的例子。
1. 加法运算:```ADD R0, R1, R2 ; 将寄存器R1和R2的值相加,结果存放在R0中```2. 减法运算:```SUB R0, R1, R2 ; 将寄存器R2的值从R1中减去,结果存放在R0中```3. 乘法运算:```MUL R0, R1, R2 ; 将寄存器R1和R2的值相乘,结果存放在R0中```4. 除法运算:```SDIV R0, R1, R2 ; 将寄存器R1的值除以R2,结果存放在R0中```5. 位移运算:```LSL R0, R1, #3 ; 将寄存器R1的值左移3位,结果存放在R0中```6. 逻辑运算:```AND R0, R1, R2 ; 将寄存器R1和R2的值进行与运算,结果存放在R0中```7. 条件分支:```CMP R0, #10 ; 将寄存器R0的值与10进行比较BNE label ; 如果不相等,则跳转到label处执行```8. 循环结构:```MOV R0, #0 ; 将寄存器R0的值设为0LOOP: ADD R0, R0, #1 ; 将寄存器R0的值加1CMP R0, #10 ; 将寄存器R0的值与10进行比较BLT LOOP ; 如果小于10,则跳转到LOOP处继续执行```9. 函数调用:```PUSH {R0, R1, R2} ; 将寄存器R0、R1和R2的值压入栈中BL function ; 调用名为function的函数POP {R0, R1, R2} ; 将栈中的值弹出到寄存器R0、R1和R2中```10. 中断处理:```LDR R0, =ISR ; 将中断服务程序的地址加载到寄存器R0中LDR R1, =0x1234 ; 将待处理的中断号加载到寄存器R1中STR R0, [R1] ; 将中断服务程序的地址存储到中断向量表中```这些例子涵盖了ARM汇编语言的基本操作,包括算术运算、位移运算、逻辑运算、条件分支、循环结构、函数调用和中断处理等。
ARMLinker的使用
ARMLinker的使用一般的可执行程序都包括代码段、数据段。
也可以简单的看作由两部分组成:RO段和RW段。
RO段一般包括代码段和一些常量,在运行的时候是只读的。
而RW段包括一些全局变量和静态变量,在运行的时候是可以改变的(读写)。
如果有部分全局变量被初始化为零,则RW段里还包括了ZI段。
RO: Read Only 代码段RW: Read Write 已初始化的全局变量ZI: Zero Init 未初始化的全局变量因为RO段是只读的,在运行的时候不可以改变,所以,在运行的时候,RO段可以驻留在Flash里(当然也可以在SDRAM或者SRAM 里了)。
而RW段是可以读写的,所以,在运行的时候必须被装载到SDRAM或者SRAM里。
在用ADS编译的时候,是需要设置RO BASE 和RW BASE的,用过ADS的应该都清楚这点。
通过RO BASE 和RW BASE的设置,告诉链接器(linker)该程序的起始运行地址(RO BASE)和RW段的地址 (RW BASE)。
如果一个程序只有RO段,没有RW段,那么这个程序可以完全在Flash里运行,不需要用到SDRAM 或者SRAM。
如果包括RW段和RO段,那么该程序的RW段必须在被访问以前被拷贝到SDRAM 或者SRAM里去,以保证程序可以正确运行。
下面这个图说明了一个程序执行前(load view)和执行时(execute view)的状态。
从图中可以看到,整个程序在执行前始放在ROM里的,在执行的时候,RW段被拷贝到了RAM里的合适位置去。
程序一开始总是存储在ROM/Flash里面的,其RO部分既可以在ROM/Flash里面执行,也可以转移到速度更快的RAM中去;而RW和ZI这两部分是必须转移到可写的RAM里去。
所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。
不同的工具链会提供一些不同的机制和方法帮助用户完成这一步操作,主要是跟链接器(Linker)相关。
ARM汇编语言编程详解
ARM汇编语言编程详解作者:机器人小助手摘要:本文旨在为读者提供一份详细的ARM汇编语言编程指南。
在介绍ARM汇编语言的基础知识后,我们将深入讨论ARM指令集的不同类型、寻址方式、寄存器的使用以及常见的编程技巧。
通过本文的学习,读者将能够深入了解ARM汇编语言的编程思想,并能够编写高效的ARM汇编语言程序。
一、ARM汇编语言简介ARM汇编语言是一种低级的程序设计语言,用于编写针对ARM架构的机器码指令。
它是一种类似于其他汇编语言的文本格式,用于表达机器指令和操作数。
通过编写ARM汇编语言程序,我们可以直接控制计算机的硬件资源,实现高效的程序执行。
二、ARM指令集概述ARM指令集是一套针对ARM架构的机器指令集合,包含多条不同功能的指令。
根据指令的功能和操作对象的不同,ARM指令可以分为数据处理指令、分支跳转指令、访存指令以及其他特殊指令。
1. 数据处理指令数据处理指令用于对操作数进行算术运算、逻辑运算、移位操作等。
这些指令可以对寄存器中的数据进行操作,并将结果存储回寄存器。
常见的数据处理指令有加法、减法、乘法、比较以及逻辑运算等。
2. 分支跳转指令分支跳转指令用于控制程序的流程,可以根据条件进行无条件跳转或有条件跳转。
通过分支跳转指令,我们可以实现程序的循环、条件分支等逻辑。
3. 访存指令访存指令用于读取或写入内存中的数据。
ARM汇编语言提供了多种不同的寻址方式,可以根据操作对象的不同进行选择。
使用访存指令,我们可以实现数据的存储和加载操作。
三、ARM汇编语言编程基础在进行ARM汇编语言编程时,我们需要了解一些基本的编程知识和技巧。
1. 寄存器的使用ARM架构提供了多个通用寄存器,用于存储临时数据。
在编写ARM汇编语言程序时,我们需要灵活使用寄存器,将数据加载到寄存器中进行计算,然后将结果保存回寄存器或内存。
2. 标志位的使用ARM架构提供了一组标志位,用于记录程序执行的状态和结果。
通过检查标志位的值,我们可以进行条件分支和判断,实现程序的流程控制。
嵌入式ARM数据加载与存取指令实验
实验三ARM数据加载与存取指令实验实验目的:1、掌握基本的单寄存器传送指令和多寄存器传送指令的使用方法;2、巩固和提高在ADS中创建工程及编写、编译和运行汇编语言程序的方法;3、巩固和提高AXD中各种调试功能。
实验环境:1、硬件:PC机。
2、软件ADS1.2。
实验内容:1、单寄存器数据传送指令的运用和各种变址寻址模式的掌握;2、多寄存器数据传送指令的运用和各种变址寻址模式的掌握;3、单个数据复制和数据块复制的方法;4、简单方程运算的汇编程序实现;5、利用调试器中各种窗口观察完成各指令操作后寄存器、存储器、标签地址、机器指令等的变化情况。
实验过程:采用单寄存器传送指令完成数据的存储和加载操作;在AXD中调试该程序,使用ARMulator 模拟目标机。
注意:本实验中所涉及的2个源代码只能分别在各自工程中调试使用,不可将两个源代码加入同一个工程中。
1、新建工程。
打开Code Warrior,选择File->New(project)选项,使用ARM Executable Image模版新建一个工程。
2、设置编译和链接选项。
由于我们使用的是模拟机,设置汇编语言编译器的模拟处理器架构为Xscale ;在ARM Linker 中,选择output 选项卡并选择Linktype 为Simple 类型,确认RO Base 为0x8000如下图所示。
3、 为当前工程添加源程序文件。
ARM 汇编程序源文件后缀名为S 大小写均可。
确保添加入当前工程复选框选上。
注意:红色部分。
4、编辑源程序代码。
单寄存器和多寄存器数据传送源程序:参考程序LAB1:AREA LAB1,CODEENTRYSTARTLDR SP,=NUMLDR R0,[SP]LDR R1,[SP,#4]LDR R3,[SP,#4]LDR R3,[SP,#4]ADD R4,R0,R1 ;计算4个数据的累加值ADD R4,R4,R2ADD R4,R4,R3MOV R4,R4,LSR #2 ;求累加后的平均值STR R4,[SP,#4] ;保存结果STOP B STOPAREA DBLOCK,DA TANUM DCD 0x12,0x34,0x56,0x78 ;分配一组字内存并赋初值END参考程序LAB2:AREA LAB2, CODEENTRYSTARTLDR SP,=NUMLDMFD SP!ADD R4,R0,R1 ;计算4个数据的累加值ADD R4,R4,R2ADD R4,R4,R3MOV R4,R4,LSR #2 ;求累加后的平均值STR R4,[SP] ;保存结果STOP B STOPAREA DBLOCK,DA TANUM DCD 0x12,0x34,0x56,0x78 ;分配一组字内存并赋初值END5、编译汇编源代码文件。
AXD 调试问题
ADS(AXD) 调试之我见以前用ADS(AXD) 进行ARM调试时遇到不少莫名其妙的问题,一会可以一会又不成,昨天跑的好好的,今就跑掉,当时感觉就是ADS这个工具不好用。
最近有接触了一下ADS(AXD)调试,觉得其实是以前不太会用,没adptor他的性情。
总结一下吧:1. AXD调试没有什么特别的,他的工作原理是将编译好的运行时映像download到ARM相应地址中去,然后捕获arm 的PC 强制其到ADS中entry point 所设置的映像入口地址上,然后你一点击run,pc就从这个入口地址取指,后面该咋执行就咋执行去了。
实际代码的硬件运行环境就是ARM芯片的运行环境。
首先要明确一点的是ADS(AXD) 在线debug时要将编译好的运行时代码download到ARM 的相应地址上去,这里这个download的地址,就是arm上存储部件的地址,必须是RAM型的存储特性才可以被AXD进行download,如果这个地址域被映射成是Flash存储器,AXD 是download不了的,虽然AXD不报错,但可以通过在AXD下用dissambly 查看一下,如果是flash则看不到正确的指令。
2.正确download之后就是执行程序了,一般外扩SDRAM要有对它时序的配置,这里用AXD调试注意一点当用外部SDRAM进行download程序时,比如说刚复位过的ARM,extern SDRAM这时还没有对他进行时序配置,这时用AXDdownload到SDRAM的话可能会有问题,(AXD是通过jtag口在通过sdram把code放到sdram上去的,如果不在axd加载code前实现配置好sdram时序就无法保证加载的正确性,和运行时的正确性,)运行会产生什么异常指令之类的怪现象。
sothat ,定要给AXD提供一个已经配置好时序确实可用的SDRAM 这样才能保证download。
3. 正确进行AXD download 后,接下来就是执行代码了, 这里也有要注意的事情,就是,代码里不要有再次对SDRAM进行时序配置的指令出现,这就好比,程序已经在SDRAM 里运行了,然后在运行的过程中又对SDRAM进行了配置,这会出现什么异常之类的怪现象的。
飞凌OK6410流水灯程序AXD2.2编译过程
飞凌OK6410流水灯程序AXD2.2编译过程1、程序1.1 init.sIMPORT MainAREA |C$$code|,CODE,READONL Yglobal startstartbl MainEND1.2 main.c#define rGPMCON (*(volatile unsigned*)(0x7F008820)) #define rGPMDAT (*(volatile unsigned*)(0x7F008824)) #define rGPMPUD (*(volatile unsigned*)(0x7F008828))void msDelay(int time){volatile unsigned int i,j;for(i=0;i<2000000;i++)for(j=0;j<time;j++);}void GPIO_Init(void){rGPMCON=0x11111;rGPMPUD=0x00;rGPMDAT=0x1F;}void LedTest(void){volatile unsigned int i;while(1){for(i=0;i<4;i++){rGPMDAT=~(1<<i);msDelay(10);}}}void Main(void){GPIO_Init();LedTest();}2、打开CodeWarrior forRVDS2.1 File->new,图1所示。
图12.2 new project 图2所示。
图22.3新建文件init.s,main.c。
图3所示图32.4添加文件到工程,图4所示。
图42.5添加源文件后的视图,图5所示。
图53、工程设置,编译,链接。
3.1 Debug Settings…图6所示。
图63.2Debug Settings对话框。
图7~图13所示。
图7图8图9图10图11图12图134、剩余步骤这里不再给出,详情请看《飞凌6410裸机调试教程.pdf》5、知识扩展:ARM映像文件(以2410为例)本文转至EDN电子技术论坛>博客>tengjingshu博客>ARM Linux学习笔记1:ARM映像文件什么是arm的映像文件arm映像文件其实就是可执行文件,包括bin或hex两种格式,可以直接烧到rom里执行。
AXD 例子详解ARMLinker
使用ADS1.2 IDE--Codewarrior创建一个ARM Executable Image工程。
并在工程中建立一个ASM文件如下:汇编程序1:AREA Example1, CODE, READONLY ;声明代码段Example1ENTRY ; 表明程序入口CODE32 ;声明32位ARM指令START MOV R0, #15 ;R0寄存器赋值为15MOV R1, #8 ;R1寄存器为8ADDS R0,R0,R1 ;R0=R0+R1B START ;跳到START去END这个ASM程序非常简单。
但我们可以从这个最简单的例子学会ARM Linker设置以及ARMulator软件仿真。
1.ARM Linker设置。
DebugRel Setting->ARM Linker页面中。
选中Output分页。
Linktype的意思是:以何种方式Link。
有3个选项:Partia:Simple: 使用简单的指定Scattered:使用分散加载文件指定Image放置地点,栈,堆位置,程序从何处开始执行等咱们首先讲Simple:Simple Image中,RO Base:表示程序放置的位置(或者是Read Only?)RW Base:表示Options: Image Entry Point:表示程序开始执行的位置。
注意,这个位置必须在RO范围内,并且4字节对奇的头位置。
例1:RO Base:0x40000000RW Base:0x40003000Image Entry Point: 0x40000000则表示,程序放在0x40000000,且从0x40000000处开始执行。
使用F5进入AXD。
则可以看到PC寄存器指向0x40000000(START处).可以一步步执行下去。
并看到Memory Start address: 0x40000000处有代码。
例2:RO Base:0x40000000RW Base:0x40003000Image Entry Point: 0x40000004则表示,程序放在0x40000000,且从0x40000004处开始执行。
AXD调试工具的使用-详解
3.使用ARMulator的调试方法 使用ARMulator的调试方法 ARMulator
AXD提供的一种软件仿真的调试方法,ARMulator调试方法。ARMulator 调试方法是一种脱离硬件调试软件的方法。这种方法所使用的工具软件 是armulate.dll。
AXD调试结构
1.2 AXD调试步骤
打开映像文件之后,大部分选项被激活。可以进行其他选项设置,也 可以开始调试。 注意:AXD没有复位功能,调试过程中如果想重新运行程序,需要重 新加载程序。
1.3 View菜单介绍
Processor Views菜单
System Views菜单
1.Control Monitor菜单介绍 Monitor菜单介绍
右键菜单中选择“Add”,系统弹出一个观测点设置对话框,如图所示
二、AXD调试方法
1.1 常用的调试方法
控制程序运行的方法分为两种: 单步运行 单步运行就是让程序一条语句接一条语句执行,可以通过 查看寄存器、内存表、变量以及表达式的值来判断程序的运 行结果。 设置断点运行。 设置断点的方法能够用来调试大段的程序。程序中并不重 要部分直接让它运行,在程序中的关键点处设置断点,当程 序运行到断点处时会自动停止,然后观察运行的结果或决定 程序是否继续运行。
在“Processor Views”菜单下“Source…”菜单用来打开源程序; “Disassembly”菜单用来打开反汇编代码文件。
4.Registers菜单介绍 Registers菜单介绍
调试中有两部分寄存器: 一部分是ARM内部的寄存器; 一部分是ARM外部其他模块的寄存器。 单击“Processor Views”→“Registers”打开一个ARM寄存器选项窗口。
AXD调试以及使用方法解析
可以用上面的方法,单步调试,观察led的亮灭, 自己也可以动手编写一些实验,可以让led按照 自己控制的方式亮灭。在所给的实验例子中,有 一个led.s。是控制led的例子,可以参考例子进 行程序的编写。
下面请大家动手调试。
查看变量
在c语言中,如果希望查看某个变量的值,可以在 processer views菜单中选择“watch”,会出现如图所示的 菜单,然后用鼠标选中变量,点击鼠标邮件,在快捷菜单 中选中“add to watch”这样变量添加到watch窗口的tab1中, 程序运行过程中,用户可以看到变量值在不断的变化。
查看一个指定的寄存器 在Processor Views里面点击watch,AXD左方就会出现Wacth Tab,在表中点击鼠标右键,add watch,就会跳出add watch的 对话框,之后在Expression里面输入你指定查看的寄存器,而后 点击Evaluate,再点击Add to View就可以了,在watch tab中就出 现你需要指定查看的寄存器了。
ARM9 C程序设计
1 点击go后进入 Main() 2 点击Step让程序单步运行
在AXD里面可以直接查看各个通用寄存器内部值的变化。
查看存储器内容 在程序运行之前,可以先查看两个宏变量IOPMOD和 IOPDATA的当前值。方法是:从Porcessor Views菜单中 选择“Memory”选项,如图所示:
AXD调试以及使用方法
调试工具条 加载完调试文件(即*.axf 文件)后,用户就可以操作AXD 运行调试工 具条中的工具按钮实现程序运行调试。AXD 运行调试工具条如图所 示, 全速运行(Go)
停止运行(Stop)
单步运行(Step In),与Step 命令不同之处在于对函数 调用语句,Step In 命令将进入该函数。
《微机原理与嵌入式系统基础》课件第8章
第 8 章 ARM 开发工具ADS
ADS囊括了一系列的应用工具,并有相关的文档和实例的 支持。使用者可以用它来编写和调试各种基于ARM家族处理 器的应用,可以为 ARM和Thumb处理器开发、编译和调试采 用C、C++和ARM汇编语言编写的程序代码。
ADS主要包含CodeWarrior IDE和AXD两部分。 CodeWarrior IDE工具主要用于工程的管理配置、源程序的编 辑、编译和链接;AXD主要用于工程的下载和调试。本章将 重点介绍图形界面的ADS 1.2 IDE开发工具。
第 8 章 ARM 开发工具ADS
4) 在线仿真器ICE 在线仿真器ICE(In-Circuit Emulator)是一种模拟CPU的设 备。它使用仿真头可以完全取代目标板上的CPU,完全仿真 ARM芯片的行为,提供更加深入的调试功能。在线仿真器通 过串行端口、并行端口、网口或USB口与宿主机连接通信。在 线仿真器为了能够全速仿真时钟速度高于100 MHz的ARM处 理器,通常必须采用更高端的设计和工艺,其价格比较昂贵。 在线仿真器通常用在ARM的硬件开发中,在软件的开发中较 少使用。 用户进行嵌入式系统的开发时,选择合适的开发工具可以 加快开发速度,节省开发成本。一套较为完备的集成开发环境 (IDE)应含有编辑器、编译器、汇编器、链接器、调试器、工 程管理器及函数库等相关工具资源。
第 8 章 ARM 开发工具ADS
3) JTAG(Joint Test Action Group,联合测试行为组织)仿真 器
JTAG仿真器也称为JTAG调试器,是通过ARM芯片的 JTAG口进行调试的设备。JTAG仿真器比较便宜,连接比较方 便,通过器件自带的JTAG口与ARM处理器核通信,它不占用 目标系统的存储器,也不占用目标系统的端口等资源。另外, 由于JTAG调试的目标程序是在目标板上执行,仿真更接近于 真实的应用情况,因此,许多接口问题,如高频操作限制、 AC和DC参数不匹配、电缆长度的限制等被最小化了。使用集 成开发环境配合JTAG仿真器进行开发是目前采用最多的一种 调试方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用ADS1.2 IDE--Codewarrior创建一个ARM Executable Image工程。
并在工程中建立一个ASM文件如下:
汇编程序1:
AREA Example1, CODE, READONLY ;声明代码段Example1
ENTRY ; 表明程序入口
CODE32 ;声明32位ARM指令
START MOV R0, #15 ;R0寄存器赋值为15
MOV R1, #8 ;R1寄存器为8
ADDS R0,R0,R1 ;R0=R0+R1
B START ;跳到START去
END
这个ASM程序非常简单。
但我们可以从这个最简单的例子学会ARM Linker设置以及ARMulator软件仿真。
1.ARM Linker设置。
DebugRel Setting->ARM Linker页面中。
选中Output分页。
Linktype的意思是:以何种方式Link。
有3个选项:
Partia:
Simple: 使用简单的指定
Scattered:使用分散加载文件指定Image放置地点,栈,堆位置,程序从何处开始执行等
咱们首先讲Simple:
Simple Image中,
RO Base:表示程序放置的位置(或者是Read Only?)
RW Base:表示
Options: Image Entry Point:表示程序开始执行的位置。
注意,这个位置必须在RO范围内,并且4字节对奇的头位置。
例1:
RO Base:0x40000000
RW Base:0x40003000
Image Entry Point: 0x40000000
则表示,程序放在0x40000000,且从0x40000000处开始执行。
使用F5进入AXD。
则可以看到PC寄存器指向0x40000000(START处).可以一步步执行下去。
并看到Memory Start address: 0x40000000处有代码。
例2:
RO Base:0x40000000
RW Base:0x40003000
Image Entry Point: 0x40000004
则表示,程序放在0x40000000,且从0x40000004处开始执行。
进入AXD,则PC寄存器指向0x40000004(MOV R1, #8)处。
并看到Memory Start address: 0x40000000处有代码。
汇编程序2:
目的1:掌握LDR/STR读取和存储数据到Memory上。
目的2:继续深入掌握AXD.
COUNT EQU 0x40003100 ;定义一个变量,地址为0x40003100 AREA Example2,CODE,READONLY
ENTRY;程序入口
CODE32 ;表明32位ARM指令
START LDR R1, =COUNT ;LDR从COUNT处读取数据到R1 MOV R0, #0;R0设为0
STR R0,[R1] ;R0的内容放置到R1所带表的地址中去
LOOP LDR R1, =COUNT ;R1 读取COUNT中内容
LDR R0,[R1] ;R0 读取R1所表示的内存区内容
ADD R0,R0,#1 R0=R0+1
CMP R0,#10 ;比较R0 和10
MOVHS R0,#0 如果R0>10 则执行这指令:将R0设为0
STR R0,[R1] 将R0内容写入R1代表的内存中去。
B LOOP
END
可以在AXD下面看Memory变化。
R0,R1的Register变化等。