第五章 四个入门范例
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
// 1+2+3+...+N的值。
1.2 实验步骤
① 启动ADS1.2,使用ARM Executable Image工程模板建立一个工程TestC。 ② 建立源文件Test.c,编写以上的实验程序,然后添加到工程中。 ③ 编译链接工程,选择Project→Debug,启动AXD进行仿真调试。
1.3 实验调试
① 在AXD调试环境下,单击菜单Option选择Configure Target,选择 ARMUL软件仿真,然后重新加载刚才编译的映像文件。 ② 单击菜单Processer Views,选择Watch,就会出现变量查看窗口。
在窗变量查看窗口里单击右键,选择菜单中的“Add Watch”,就会弹出 Add Watch窗口,在这个窗口中,我们可以把要观察的变量添加到Watch 窗口中。
1.1 工程的编辑
1、建立工程: 建立工程:
选择Windows操作系统的“开始”→“所有程序”→“ARM Developer Suite v1.2”→“CodeWarrior for ARM Developer Suite” 命令启动 Metrowerks CodeWarrior或双击CodeWarrior for ARM Developer Suite 快捷方式启动。启动CodeWarrior IDE的过程如图所示。
③ 在内存查看窗口中单击右键,弹出快捷菜单。设置内存单元显示比特 大小为32 Bit。如左图所示;设置内存单元显示格式为16进制显示,如寄存器R0~R3和内存表的数值变化。 ⑤ 在Start.S的“B Main”处双击,设置断点,然后全速运行程序(F5快捷 键)。程序在断点处停止。内存表数据如图所示
1.1 实验程序
array.h程序清单。
/************************************************************************** ** 函数名称: ArrayMinData ** 功能描述: 对数组中的数据找出其最小值 ** 参 数: arrayAddr 数组的地址 num 数组的长度 ** 返回值 : 数组中的最小值( int 型 ) **************************************************************************/ extern int ArrayMinData( int *arrayAddr, int num ); /************************************************************************** ** 函数名称: ArrayMaxData ** 功能描述: 对数组中的数据找出其最大值 ** 参 数: arrayAddr 数组的地址 num 数组的长度 ** 返回值 : 数组中的最大值( int 型 ) **************************************************************************/ extern int ArrayMaxData( int *arrayAddr, int num );
点击“New Text File”图标按钮。建立一个文本文件。
然后在新建的文件中编写上述加法运算程序。
单击“Save”图标按钮将文件存盘(或者在“File”菜单中执行“Save”命 令),输入文件全名。 注意:请将文件保存到相应工程的目录下,以便于管理和查找。
3、添加文件到工程: 添加文件到工程:
在test.mcp工程窗口中的“Files”子窗口里右击鼠标,就会弹出浮动菜单, 选择“Add Files”命令。
选择“Add Files”命令后即可弹出Select files to add对话框,选择相应 的源文件,然后点“打开”按钮即可。
单击“打开”按钮就会自动的弹出Add Files窗口,单击“OK”即可。
ADS1.2集成开发环境的组成
名称 代码生成工具 集成开发环境 调试器 指令模拟器 ARM开发包 ARM应用库 描述 ARM汇编器,ARM的C、C++编译器, Thumb的C、C++编译器,ARM连接器 Code Warrior IDE AXD,ADW/ADU,armsd ARMulator 一些底层的程序例子,使用程序 C、C++函数库等 使用方法 由Code Warrior IDE调用 工程管理,编译链接 仿真调试 由AXD调用 由Code Warrior IDE调用 用户程序使用
在编译链接输出窗口中,显示的是各个输入段代码或数据的长度表,其 中包含total总长度信息。这些长度表大体上分为两种:
① Image component sizes(映像组件长度) (映像组件长度) 映像组件长度信息包含目标文件(Object)和库文件(Library)两组。 其中每组中又包含了Code、RO Data、RW Data、ZI Data、Debug 5 组详细信息。Grand Totals列出的是Object Totals和Library Totals对应项 之和。 ② Total sizes(总长度) (总长度) 总长度信息包含总的代码长度和总的数据长度:Total RO Size为总的 代码长度;Total RW Size为总的数据长度;Total ROM Size为装载到只 读存储器中的程序长度。
单击“File”菜单,选择“New”菜单项即弹出New对话框。
选择ARM Executable Image(ARM可执行映像)工程模板; 在“Project name:”中输入工程文件名; 点击“Location:”文本框的“Set…”按钮,浏览选择想要将该工程保 存的路径。
2、建立文件: 建立文件:
第五章
四个操作范例
一、ADS1.2集成开发环境 二、范例一 汇编语言程序实验 三、范例二 C程序实验 四、范例三 C程序与汇编程序实验 五、范例四 库文件定义与使用 六、本节附录
一、ADS1.2集成开发环境
ADS集成开发环境,其成熟版本为ADS1.2。支持软件调试及JTAG硬件仿真 调试,支持汇编、C和C++源程序,具有编译效率高,系统库功能强等特点。
5、生成文件
选择Debug Rel生成目标,编译链接成功后,会在DebugRel目录下生成 一些文件。
其中ObjectCode目录下保存着生成的目标文件,这些目标文件都是以 *.o为后缀; TargetDataWindows.tdt记载着这个工程项目中哪些源文件已经被编 译,哪些源文件需要重新编译; 图中test为编译之后生成的映像文件。
三、范例二 C语言程序实验
1.1 实验程序
Test.c文件的程序代码
int main(void) { int i,N,sum; scanf("%d",&N); sum = 0; for(i=1; i<N+1; i ++ ) sum=sum + i; printf("结果=%d\n",sum); }
③ 按F5快捷键全速运行程序,程序会自动在main语句处停止。按Shift+F8快捷键, 单步运行程序。此时,在Watch窗口中就可以观察到变量的变化。在Console 窗口中输入N的值,最终运行程序如图所示。
四、范例三 C程序与汇编程序实验
1.1 实验程序
Start.s文件的程序代码
; 起动文件。初始化C程序的运行环境,然后进入C程序代码。 IMPORT |Image$$RW$$Base| IMPORT Main ; 声明C程序中的Main()函数 AREA Start,CODE,READONLY ; 声明代码段Start ENTRY ; 标识程序入口 CODE32 ; 声明32位ARM指令 Reset LDR LDR MOV STR MOV CMP ADDCC STRCC ADDCC BCC B END SP, =0x40003F00 R0, =|Image$$RW$$Base| R1, #0 R1, [R0] R2, #0 R2, #10 R3, R1, R2 R3, [R0], #4 R2, R2, #1 LOOP Main ; RW Base地址存储数据变量 ; 初始化sum=0
4、编译链接工程
通过工程窗口中的图标按钮,可以快速的进行工程设置、编译链接、 启动调试等等。
单击DebugRel Settings 图标按钮,即可进行工程的地址设置、输出文件设 置和编译选项等。
对于简单的软件调试,直接单击工程窗口的Make图标按钮,即可完成 编译链接。若编译出错,会有相应的出错提示。双击出错提示行信息, 编译窗口即会使用光标指出当前错误的源代码行,编译链接输出窗口如 图所示。也可以在Project菜单中找到相应的命令。
二、范例一 实现加法运算
实现加法的汇编程序
AREA Example1,CODE,READONLY ;声明代码段 Example1 ENTRY ;标识程序入口 CODE32 ;声明32位ARM指令 START MOV MOV ADDS B END R0,#45 R1,#3 R0,R0,R1 START ;设置参数 ;R0 = R0 + R1
单击File菜单,选择Load Image加载ELF格式的可执行文件,即*.axf文件, 如右图所示。
单击File菜单,选择 Load Image加载ELF 格式的可执行文件,即 *.axf文件。选择 Test.axf文件,并把它 加载到AXD调试环境中。
3、单步调试程序
单击Processor Views菜单,选择Registers打开寄存器窗口
1.1 Code Warrior IDE简介
ADS1.2使用了Code Warrior IDE集成开发环境,用户在这个IDE集成开 发环境下可以方便的编写程序并管理好整个工程项目。
1.2 AXD调试器简介
ADX调试器为ARM扩展调试器。AXD能够装载映像文件到目标内存, 具有单步、全速和断点等调试功能,可以观察变量、寄存器和内存的 数据等等。
在寄存器窗口中,打开Current栏的 + 号,即弹出处理器当前模式下的 寄存器名和相应的数值(十六进制表示) 。
按F8快捷键单步运行程序,在寄存器窗口可以看到程序运行的结果。
4、调试工具条介绍
全速运行(Go); 停止运行(Stop); 单步运行(Step In),与Step命令不同之处在于对函数调用语句, Step In命令将进入该函数。 单步运行(Step),每执行一条语句,这时函数调用将被作为一 条语句。 单步运行(Step Out),执行完当前被调用的函数。 运行到光标(Run To Cursor),运行程序直到当前光标所在的位 置时停止。 设置断点(Toggle BreakPoint)。
{
// 计算array数组之和的值。
}
1.2 实验步骤
① 启动ADS1.2,建立一个工程ProgramC。 ② 建立源文件Start.S和Test.c,编写实验程序,然后添加到工程中。 ③ 设置工程链接地址RO Base为0x4000,RW Base为0x9000。
④ 设置调试入口地址Image entry point为0x8000。设置好之后点击 Apply按钮。
⑥ 单步运行程序, 判断程序是否跳 转到C程序中运 行。 ⑦ 选择Processor Views→Variabl es打开变量观 察窗口。观察全 局变量的值。 ⑧ 程序运行到 Next()函数时,继 续单步运行程序, 判断程序是否跳转 到汇编程序中运行。
五、范例三 库文件定义与使用
设计一个实现对数组中的数据查找出最小值和最大值的函数库。包括头文件和二进 制库文件。头文件中声明外部可调用的函数原型,本例中头文件名为array.h。二进 制库文件是由头文件相对应的定义文件经ADS编译后得到的二进制代码文件, array.h对应的定义文件名为ARRAY.c。
1.2 工程的调试
1、选择调试目标
当工程编译链接通过后,在工程窗口中单击 Debug图标按钮,即可 启动AXD进行调试(也可以通过“开始”菜单启动AXD)。
选择ARMUL(软件仿真),单击OK。
2、加载可执行文件
重新装载最近使用的映像文件,如左图所示。点击“是”AXD会自动 重新装载映像文件,点击“否”我们可以手动加载。
⑤ 设置位于开始位置的起始代码段。
⑥ 编译链接工程,选择Project→Debug,启动AXD进行仿真调试。
1.3 实验调试
① 在AXD调试环境下,单击菜单Option选择Configure Target,选择ARMUL软 件仿真。
② 单击菜单Processer Views,选择Registers和Memory,就会出现寄存 器查看窗口和内存查看窗口。在Memory Start address文本框中填写内存 查看地址0x9000(RW Base),回车后内存查看窗口即出现地址从 0x9000开始的内存单元存储内容。
LOOP
; array[i]= i ; i=i + 1 ; 跳转到C程序代码Main()函数
Test.c文件的程序代码 int sum, array[9]; void Main(void) int i; for(i=0; i<9; i ++ ) { sum=sum + array[ i ]; array[i] = 0; }