ADS1.2 - 开发环境

更新时间:2024-02-01 10:00:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验六

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 extern int add(int,int); int main() { int a,b; } printf(\半主机方式输出*/ scanf(\printf(\return 0;

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 手册 相关章节。

本文来源:https://www.bwwdw.com/article/14dw.html

Top