Exceptions 异常 之 Undefined Instruction Exception


硬件说明  

 

特别说明:上面的r14就是lr;ldmfd最后加^号,代表spsr->cpsr。

Undefined Instruction exception

硬件说明

异常处理程序部分:

代码文件vector/vector.S  

复制代码
 1 @@@@寄存器地址定义,用于闪灯@@@@
2 #define GPMCON 0x7F008820
3 #define GPMDAT 0x7F008824
4
5 @@@@程序入口主函数@@@@
6 .global _start
7 _start:
8 nop @@@占位符,此位置默认时reset execption执行pc指向的@@@
9 b und_expt_handler
10 nop
11 nop
12 nop
13 nop
14 nop
15
16 und_expt_handler:
17 @@@设置好此异常模式的堆栈地址@@@
18 mov sp, #0x2000 @@@0x2000等于8kByte处,即为芯片内ram的最高地址@@@
19
20 @@@压栈,保护现场。lr的值为产生当前und异常指令的下一条指令的地址@@@
21 stmfd sp!, {r0-r12, lr}
22 push {lr} @@@在后面用于取出产生und异常的指令码@@@
23
24 @@@设置GPM0/1/2/3为输出口,闪灯用@@@
25 ldr r0, =GPMCON
26 ldr r1, [r0]
27 ldr r2, =~0xffff
28 and r1, r1, r2
29 ldr r2, =0x1111
30 orr r1, r1, r2
31 str r1, [r0]
32
33 @@@灯亮@@@
34 ldr r0, =GPMDAT
35 mov r1, #0x0
36 str r1, [r0]
37 bl delay
38
39 @@@打印产生当前异常的指令码@@@
40 pop {lr}
41 ldr r0, =str
42 ldr r1, [lr, #-4] @@@靠lr取得异常的指令码@@@
43 mov lr, pc
44 ldr pc, printf
45
46 @@@灯灭@@@
47 ldr r0, =GPMDAT
48 mov r1, #0xf
49 str r1, [r0]
50 bl delay
51
52 @@@出栈,恢复现场,恢复模式并返回@@@
53 ldmfd sp!, {r0-r12, pc}^
54
55 delay:
56 ldr r3, =0x6ffffff
57 dloop:
58 subs r3, r3, #1
59 bne dloop
60 mov pc, lr
61
62 printf:
63 .word 0x57e11df8 @@@u-boot中printf函数的地址@@@
64 str:
65 .string "\nundefined instruction execption %x handled ...\n\n"
66 .align 4 @@@表示上面的字符串按4字节对齐@@@
复制代码

连接脚本vector/vector.lds

复制代码
 1 OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
2 OUTPUT_ARCH(arm)
3 ENTRY(_start)
4 SECTIONS
5 {
6 . = 0x0;
7 .text :
8 {
9 *(.text);
10 }
11 .align = 4;
12 }
复制代码

说明:此程序放在0x00000000地址处

vector/Makefile

1 all:
2 arm-none-linux-gnueabi-gcc -c vector.S -o vector.o
3 arm-none-linux-gnueabi-ld -T vector.lds vector.o -o vector
4 arm-none-linux-gnueabi-objcopy -O binary vector /tftpboot/vector.bin

测试主程序部分:

代码文件test.S

复制代码
 1 @@@程序入口主函数@@@
2 .global _start
3 _start:
4 @@@压栈,保护现场@@@
5 stmfd sp!, {r0-r12, lr}
6
7 @@@提示und异常测试开始@@@
8 ldr r0, =teststart
9 mov lr, pc
10 ldr pc, printf
11
12 @@@连续3条会产生und异常的指令@@@
13 .word 0x77777777
14 .word 0x77777778
15 .word 0x77777779
16
17 @@@提示und异常测试结束@@@
18 ldr r0, =testend
19 mov lr, pc
20 ldr pc, printf
21
22 @@@出栈,恢复现场,并返回@@@
23 ldmfd sp!, {r0-r12, pc}
24
25 printf:
26 .word 0x57e11df8 @@@u-boot中printf函数的地址@@@
27
28 teststart:
29 .string "undefined instruction exception test start ...\n"
30 .align 4 @@@指示上面的字符串按4字节对齐@@@
31
32 testend:
33 .string "undefined instruction exception test end .....\n"
34 .align 4 @@@指示上面的字符串按4字节对齐@@@
复制代码

连接脚本test.lds

复制代码
 1 OUTPUT_FORMAT("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
2 OUTPUT_ARCH(arm)
3 ENTRY(_start)
4 SECTIONS
5 {
6 . = 0x50008000;
7 .text :
8 {
9 *(.text);
10 }
11 .align = 4;
12 }
复制代码

  说明:此程序放在0x50008000地址处

Makefile

1 all:
2 arm-none-linux-gnueabi-gcc -c test.S -o test.o
3 arm-none-linux-gnueabi-ld -T test.lds test.o -o test
4 arm-none-linux-gnueabi-objcopy -O binary test /tftpboot/test.bin
5 make -C ./vector

  说明:第5句表示进入子目录vector中执行make命令
编译程序

1 # make                                                              

运行程序

  在u-boot命令行状态 

1 $ tftp 0 vector.bin
2 $ tftp 50008000 test.bin
3 $ go 50008000

运行结果

复制代码
 1 ## Starting application at 0x50008000 ...                                                               
2 undefined instruction exception test start ...
3
4 undefined instruction execption 77777777 handled ...
5
6
7 undefined instruction execption 77777778 handled ...
8
9
10 undefined instruction execption 77777779 handled ...
11
12 undefined instruction exception test end .....
13 ## Application terminated, rc = 0x1
复制代码

  说明:开发板上同时看到灯亮灯灭共3次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值