ADS1.2 - 开发环境
更新时间:2024-02-01 10:00:01 阅读量: 教育文库 文档下载
- ads1.2安装教程推荐度:
- 相关推荐
实验六
ADS1.2 开发环境
一、实验目的
熟悉ADS1.2开发环境,学会ARM仿真器的使用。使用ADS编译、下载、调试并跟踪一段已有的程序,了解嵌入式开发的基本思想和过程。
二、实验内容
本次实验使用ADS集成开发环境。新建一个简单的工程文件,并编译这个工程文件。学习ARM仿真器的使用和开发环境的设置。下载已经编译好的文件到嵌入式控制器中运行。学会在程序中设置断点,观察系统内存和变量,为调试应用程序打下基础。
三、预备知识
C语言的基础知识、程序调试的基础知识和方法。
四、实验设备及工具(包括软件调试工具)
硬件:ARM嵌入式开发平台、PC机Pentium100以上、用于ARM920T的JTAG仿真器、串口线。
软件:PC机操作系统Win2000或WinXP、ARM ADS1.2集成开发环境、仿真器驱动程序、超级终端通讯程序。
五、实验步骤
0、安装ARM ADS1.2集成开发环境(过程略) 1、建立工程
(1)运行ADS1.2集成开发环境(CodeWarrior for ARM Developer Suite)。选择File|New…菜单,在对话框中选择Project,如图1B-1所示,新建一个工程文件。图中示例的工程名为Exp6.mcp。点set…按钮可为该工程选择路径如图2-1所示,选中CreatFolder选项后将以图2-1中的ProjectName或图2-2中的文件名为名创建目录,这样可以将所有与该工程相关的文件放到该工程目录下,便于管理工程。
在图2-1中工程模板列表中选择ARM Executable Image通用模板。项目名可随意取。
图2-1 新建工程
图 2-2 保存工程
(2)在新建的工程中,如图2-3所示,选择Debug版本,使用Edit | Debug Settings菜单对Debug版本进行参数设置。
图 2-3 选择版本
(3)在Debug Settings对话框中选择Target Settings项,如图2-4所示。在Post-linker一栏中选择ARM fromELF。
图2-4 Target Settings
(4)在Debug Settings对话框中选择ARM Linker项,如图2-5。在Output选项卡的Simple image框中设置连接的Read-Only(只读)和Read-Write(读写)地址。地址0x30008000是开发板上SDRAM的真实地址,是由系统的硬件决定的;0x30200000指的是系统可读写的内存地址。也就是说,在0x30008000?0x30200000之间是只读区域,存放程序的代码段,在0x30200000开始是程序的数据段。(注:以下在模拟器上运行,RO Base地址选0X8000,如下图设置)
图2-5 设置连接地址范围
图2-5所示的设置只是一种简单设置,(以下灰色字体暂时跳过)如果程序需要用到标准C库函数的话需要按图2-6进行连接地址的设置。
标准C中如果使用malloc及其相关的函数,需要使用系统的堆(Heap)空间,可以通过scatter文件来描述系统HEAP段的位置。针对2410开发板,把程序的入口定位在0x30008000,并定义scatter文件为scat_ram.scf。在图2-6中选择LinkType为Scattered, 输入scatter文件名scat_ram.scf;然后切换到Options选项卡在Image Entry Point 框中输入0x30008000。也可以在图2-6的Command Line框中直接输入-entry 0x30008000 -scatter scat_ram.scf进行上述设置。
图2-6 通过scatter文件设置连接地址
提示:
1)程序移植到ADS后,程序最开始首先执行用汇编写的初始化代码——包括中断向量和堆栈的初始化。在该段代码中使用
IMPORT __main ;注意main前面是两个下划线 B
__main
进行系统内部的标准C函数初始化,然后调用用户在C中定义的main()函数(注意:两个main都是小写),并且在嵌入式应用中用户C的main函数中不能有参数(int main(void))。
2)不能有系统定义的软中断,在汇编中可以使用 IMPORT __use_no_semihosting_swi
来检测,在C中使用
#pragma import(__use_no_semihosting_swi) // ensure no functions that use semihosting
3)scatter文件内容如下,创建了一个RAM_LOAD的程序和数据的装载区域,起始地址0x30008000。
RAM_LOAD 0x30008000 { RAM_EXEC +0 {
startup.o (init, +First) * (+RO) }
L0PAGETABLE 0x30200000 UNINIT ;about 2MByte offset SDRAM {
pagetable.o (+ZI) }
STACKS +0x100000 UNINIT ;64KByte under L0 pagetable
{
stack.o (+ZI) } RAM +0 }
4)定义retarget.c函数,重新定位标准C库中stdio的一些相关函数。主要有: struct __FILE { int handle; /* Add whatever you need here */}; FILE __stdout; //文件的定义
int fputc(int ch, FILE *f) //fputc函数 int ferror(FILE *f)
//ferror函数
void _sys_exit(int return_code) //系统退出函数 int __raise(int signal, int argument)
__value_in_regs struct __initial_stackheap __user_initial_stackheap(unsigned R0, unsigned SP, unsigned R2, unsigned SL)//用户的堆空间和栈空间函数
具体定义,可以参考init/retarget.c
(5)在第(4)步中如果不选择简单的连接地址设置,则需按图2-7所示设置C编译器。在Debug Settings对话框中选择ARM C Compiler项,在ATPCS选项卡中选择ARM/Thump interwork,或者在命令行中添加-apcs /interwork。
{ } { } { }
exception.o (+RO) heap.o (+ZI) * (+RW,+ZI)
HEAP +0 UNINIT
EXCEPTION_EXEC 0 OVERLAY ;exception region
图2-7 设置ARM C Compiler
(6)在第四步中如果选择简单的地址连接设置,在Debug Settings对话框中选择ARM Linker项,如图2-8。在Layout选项卡的Place at beginning of image框中设置程序的入口模块。指定在生成的代码中,程序是从startup.s开始运行的。Object 设为startup.o,section设为init。
图 2-8 设置入口模块
(7)在Debug Settings对话框中选择ARM fromELF项,如图2-9。在Output file name框中设置输出文件名为system.bin,这就是要下载到开发板的嵌入式应用程序文件。
图2-9 设置输出文件名
(8)回到如图2-10所示的工程窗口中,选择Release版本,使用Edit | Release Settings菜单对Release版本进行参数设置。
(9)参照第(3)、(4)、(5)、(6)、(7)步在Release Settings对话框中设置Release版本的Post-linker、连接地址范围、入口模块和输出文件。
(10)回到如图2-3所示的工程窗口中,选择Targets选项卡,如图2-10所示。选中DebugRel版本,按Del键将其删除。DebugRel子树是一个折衷版本,通常用不到,所以在这里删除。
图 2-10 删除DebugRel版本
(11)设置完成后,可以将该新建的空工程文件作为模板保存以便以后使用。将工程文件名改为2410 ARM Executable.mcp。然后在ADS1.2软件安装目录下的Stationery目录下新建名为2410 ARM Executable Image的模板目录,再将刚设置完的2410 ARM Executable.mcp工程模板文件存放到该目录下即可。这样以后新建工程的时候如图2-1所示就能看到以2410 ARM Executable Image为名字的模板了。
(12)
添加文件的方法如下。
单击ADS菜单命令\File?New\,打开如图 2.11 所示的对话框,选择
\File\选项卡,设置此文件的文件名和存储位置,然后在打开的编辑器中输入相应的程序。
图 2-11 加入工程文件 subrout.s文件添加如下内容: AREA subrout, CODE, READONLY ; name this block of code ENTRY ; mark first instruction ; to execute start MOV r0, #10 ; Set up parameters MOV r1, #3 BL doadd ; Call subroutine stop MOV r0, #0x18 ; angel_SWIreason_ReportException LDR r1, =0x20026 ; ADP_Stopped_ApplicationExit SWI 0x123456 ; ARM semihosting SWI doadd ADD r0, r0, r1 ; Subroutine code MOV pc, lr ; Return from subroutine. END ; Mark end of file
(13)在mcp项目管理界面中,双击图2-11中的subrout.s,打开该文件,可以查看程序的内容,这时也可运行程序。
读者可以查看其他源文件的内容以对系统运行有所了解。可以发现ADS的文本编辑器已经有了很大的改善,文本按语法分颜色显示,读者可以根据喜好在Edit菜单下的Preferences窗口中进行设置。并可以很好的支持中文注释。
2 、AXD调试器介绍
1)配置JTAG仿真器
(1) 添加驱动(暂时略过)
首先 安装UarmJtag2.0软件,默认安装路径: \\Program Files\\UarmJtag\\driver\\LPTJtag.inf
其次 开始→控制面板→添加硬件→下一步→选-是我已经连接了此硬件→下一步→选中-添加新的硬件设备→下一步→选中安装我手动从列表选择的硬件→下一步→选择-显示所有设备→选择(过程比较长)→从磁盘安装-浏览,指定驱动为C:\\Program
Files\\UArmJtag\\driver\\LPTJtag文件,点击确定,然后点击下一步,安装好驱动。 (以Windows XP 为例)
注意:调试过程中,需要保持UarmJtag软件为开启状态,处理器选择arm9,否则AXD会提示出错。
(2)AXD配置 在AXD中,
选择菜单 Options\\Configure target… 如图2-12
图 2-12
图2-13
在弹出的对话框中选择ARMulate.dll,即选用模拟仿真器 如上图 2-13 点击确定后,系统开始下载仿真程序。
2)AXD 调试器介绍
打开一个ADS工程,启动Uarmjtag软件,选择arm9处理器然后最小化。在已打开ADS的工程中选择dubug 如下图2-15
图 2-15
后会弹出AXD对话框如图2-16
图2-16
如果载入.ses文件失败,重新对target进行配置。
在AXD我们会看到所要查找的信息其显示为如图2-17
图2-17
(1) CPU寄存器窗口
在AXD中选择processor Registers,在其左边会显示一个窗口 如图2-18
图2-18
(2) 变量窗口
在AXD中选择context Variables ,在其左边会显示出如图2-19信息
图2-19
(3) 查看内存内容
在 AXD中选择Memory,在其下方会显示出如图2-20信息
图2-20
(4)设置断点
在AXD中选择Toggle Breakpoint,显示信息如图2-21
图2-21
3 、ADS运行C语言程序
在完成上述任务基础上,重新创建一个项目hello,并在项目内添加如下文件:
hello.c #include
add.c int add(int a,int b) { return a+b; }
然后编译和调试,观察效果。
2、使用 ADS 调试程序实例
在 ADS 环境下的 AXD 调试器,读者可以逐步跟踪汇编程序的执行,也可以很方便地查看到寄存器和内存单元的数据变化过程。
1. 程序源代码
本节以一个汇编程序为例,介绍如何在 ADS 下的调试器 AXD 环境下如何调试汇编程序。在此程序中,主要演示的是乘法指令的实现。以下是此汇编程序的内容。 AREA mysample, CODE, READONLY ; name this block of code ENTRY START MOV R0,#0XFF000000 ;对 R0 赋值 #0XFF000000 MOV R1,#-0X10 ;对 R1 赋值 #-0X10 MOV R2,#0X1000000 ;对 R2 赋值 #0X1000000 MOV R3,#0 ;对 R3 赋值 #0 MULS R4,R0,R1 ;R4=R0*R1,结果影响寄存器CPSR 的值 SMULLS R6,R5,R1,R0 ;R6=R1*R0 的低32位、R5=R1*R0 的高32位, ;结果影响寄存器CPAR 的值 UMULLS R8,R7,R1,R0 ;R8=R1*R0 的低32位、R7=R1*R0 的高32位,结果影响寄存器CPSR的值 MLA R3,R0,R1,R2 ;R3=R0*R1+R2 SMLAL R6,R0,R1,R2 ;R6=R1*R2 的低32位+R6,R0=R1*R2 的高32位+R0 UMLAL R8,R0,R1,R2 ;R8=R1*R2 的低32位+R8,R0=R1*R2 的高32位+R0,其中R1、R2 的值为32位无符号数
STOP ;R8、R0 的值为64位无符号数 BL STOP END 2. 关键语句在调试器中的运行结果
在ADS项目管理中执行debug按钮(debug比起run模式,具有单步调试功能)如下图所示:
正常情况下,将弹出AXD调试界面:
然后如下执行分步调试F10
现在,在 AXD 窗体左边可以打开 ARM 处理器在不同模式下的寄存器,即可以以十六进制方式查看各寄存器数据(注意ADS选择Debug,在AXD中选择分步执行F10的情况下)。如图 4.19 所示为进行程序入口时各寄存器数据(所有寄存器数据初始化为 0,PC 指针指向的地址为程序员在编程时设置的 RO 地址(Read Only 地址),CPSR 和 SPSR 寄存器中各位置位时(即为 1) 为大写,清零时为小写。如图 4.20 所示为以下几行指令执行后的结果,从图中可以看出, 影响的寄存器为 R0、R1、R2 和 R3。注意负数的存储形式。 MOV R0,#0XFF000000 MOV R1,#-0X10 MOV R2,#0X1000000 MOV R3,#0
如图 4.21 所示为执行以下乘法指令前各寄存器的值,如果是两个 32 位数乘法,其结果为 64 位,需要两个寄存器来存储结果。如图 4.22 所示为乘法执行后的结果。注意带S后对 CPSR 的影响。 MULS R4,R0,R1 ;R4=(R0*R1)低32位 SMULLS R6,R5,R1,R0 ;R6=(R0*R1)低32位,R5=(R0*R1)高32位 UMULLS R8,R7,R1,R0 ;无符号乘法
以下是执行带加法的乘法指令运算,如图 4.23 所示为运行后的状态。 MLA R3,R0,R1,R2 ;(1) (带加法的乘法运算) SMLAL R6,R0,R1,R2 ;(2) (带加法的长乘法运算) UMLAL R8,R0,R1,R2 ;(3)
以上演示了使用 AXD 调试时如何查看寄存数据变化的情况,如果要查看内存单元数 据,可以在 AXD 环境下单击菜单命令\来打开内存单元。另外, 读者还可以查看变量、全局符号等相关参数的变化。关于这些内容,请读者参阅 ADS 手册 相关章节。
正在阅读:
ADS1.2 - 开发环境02-01
垂径定理练习题及标准答案03-20
初一数学教案新部编本05-29
数学实验作业8月12日第五组01-19
课题:第十二章《简单机械》复习导学案07-09
电大 网络实用技术基础 形考作业四04-02
二次供水水污染事故报告制度10-10
中财各章练习题10-05
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 环境
- 开发
- ADS
- 1.2