XI`AN TECHNOLOGICAL UNIVERSITY
实验报告
实验课程名称 ARM嵌入式系统原理及其应用开发
专 业: 物联网工程 班 级: 16060616 姓 名: 田宇龙 学 号: 16060616107 实验学时: 指导教师: 成 绩:
2018 年 6 月 18 日
1
西安工业大学实验报告
专业 实验课程 实验项目 实验设备及器材
物联网工程 综合实验 班级 指导教师 16 姓名 实验日期 综合实验 田宇龙 2018 学号 同实验者 16060616107
PC机、Keil ,ProteusARM仿真软件,windows xp 一丶实验目的
掌握处理器启动配置过程;
掌握使用Embest IDE 辅助信息窗口来分析判断调试过程和结果,学会查找软件调试时的故障或错误;
掌握使用Embet IDE 开发工具进行软件开发与调试的常用技巧。
二、实验内容
完成一个完整的工程,要求包含启动代码,汇编函数,和C 文件,而且C 文件包含ARM 函数和Thumb 函数,并可以相互调用。
三、实验原理
1). 打开实验例程目录下的ZHSY 工程,按以下步骤观察工程配置的内容:
(1) 在 Assembler 页面选择 Make the assembled code as supporting, interworking 设置
2
(2) 在Compiler 页面选择ARM interworking 设置
(3) Thumb Files 文件组选择自定义C 与汇编语言文件输出的编译设置,并分别配置编译器和汇编器,
3
2)参考前面实验步骤进行编译链接interwork 工程,并下载调试;单步执行程序,通 过memory/register/watch/variable 窗口分析判断运行结果;
3)使用Embest IDE 工具Disassemble all 把elf 文件转换成objdump 文件,打开并观察代码的存放,并查看链接脚本文件中的相关代码段定义;同时查看 Thumb_function 和 ARM_function 标号定义的程序代码,并与实际源代码进行 比较,掌握通过objdump 文件和源程序文件相互查找问题的方法;
4.)使用Embest IDE 工具elf2bin 把elf 文件转换成可执行bin 文件,在IDE 中打开 后观察执行代码与 objdump 文件中的命令行进行比较,进一步加深对执行代码的 链接定位的理解;
5.)单步跟踪ARM 函数与Thumb 函数相互调用的反汇编代码,分析arm 内核的状态 切换过程
四丶实验代码
arm.c 参考程序 extern char szArm[20];
4
static void delaya(int nTime)
{ int i, j, k; k = 0;
for(i = 0; i < nTime; i++) { for(j = 0; j < 10; j++)
k++;
}
}
void arm_function(void) {
int i;
int nLoop;
unsigned int unRandom;
char *p = \"Hello from ARM world\";
For(i =0; i < 20; i++) szArm[i] = (*p++);
delaya(2);
for( nLoop = 0; nLoop < 10; nLoop++ ) { }
5
unRandom = randomnumber();
}
entry.s 参考程序 .equ count, 20 .extern thumb_function .global _start .text _start:
# Setup interrupt / exception vectors
b Reset_Handler
Undefined_Handler:
b Undefined_Handler SWI_Handler:
b SWI_Handler Prefetch_handler:
b Prefetch_handler Abort_Handler:
b Abort_Handler
nop IRQ_Handler:
b IRQ_Handler FIQ_Handler:
6
b FIQ_Handler
Reset_Handler:
ldr sp, =0x0C002000 mov r0, #count mov r1, #0 mov r2, #0 mov r3, #0 mov r4, #0 mov r5, #0 mov r6, #0 loop0:
add r1, r1, #1 add r2, r2, #1 add r3, r3, #1 add r4, r4, #1 add r5, r5, #1 add r6, r6, #1 subs r0, r0, #1 bne loop0
adr r0, Thumb_Entry+1 bx r0
7
.thumb Thumb_Entry:
mov r0, #count mov r1, #0 mov r2, #0 mov r3, #0 mov r4, #0 mov r5, #0 mov r6, #0 mov r7, #0 loop1:
add r1, #1 add r2, #1 add r3, #1 add r4, #1 add r5, #1 add r6, #1 add r7, #1 sub r0, #1 bne loop1
8
bl thumb_function b Thumb_Entry .end
random.s 参考程序: .global randomnumber .global __gccmain .global seed .text
randomnumber: # on exit:
# a1 = low 32-bits of pseudo-random number # a2 = high bit (if you want to know it)
ldr ip, seedpointer ldmia ip, {a1, a2} tst a2, a2, lsr#1 movs a3, a1, rrx adc a2, a2, a2 eor a3, a3, a1, lsl#12 eor a1, a3, a3, lsr#20 stmia ip, {a1, a2}
9
mov pc, lr seedpointer:
.long seed __gccmain: mov pc, lr .data seed:
.long 0x55555555 .long 0x55555555 .end
实验程序运行图如下:
10
五丶心得体会
本次实验实验较为复杂,虽然程序源代码采用指导书上的内容,但是在个人实验时仍然遇到不少问题,其中程序运行环境的配置方面便遇到不少问题,文件之间的调用关系仍然存在一些理解问题,虽然在同学的帮助下完成了本次实验,单个人认为本次实验完成不是很满意,希望接下来能够去解决相关问题,为下次实验打好基础。
11
因篇幅问题不能全部显示,请点此查看更多更全内容