问一个arm中断的问题

arche   2008-1-22 21:06 楼主
我的环境:at91rm9200+28F128+dataflash
我运行仿真器时,程序执行起点是__ENTRY,地址是0x20000000,(1)请问这个地址是可变的吗?
1ffffff4        [0xffffffff]   dci      0xffffffff ; ? undefined
1ffffff8        [0xffffffff]   dci      0xffffffff ; ? undefined
1ffffffc        [0xffffffff]   dci      0xffffffff ; ? undefined
__ENTRY                [0xea000009]   b        InitReset
undefvec        [0xeafffffe]   b        undefvec
swivec                [0xe59ff010]   ldr      pc,SWI_Addr ; = #SWI_Addr
pabtvec                [0xe59ff010]   ldr      pc,PrefetchAddr ; = #PrefetchAddr
dabtvec                [0xe59ff010]   ldr      pc,DataAbortAddr ; = #DataAbortAddr
rsvdvec                [0xeafffffe]   b        rsvdvec
irqvec                [0xe51fff20]   ldr      pc,0x1ffff100 ; = #0xfffcecec
fiqvec                [0xeafffffe]   b        fiqvec
SWI_Addr        [0x2000752c]   dcd      0x2000752c  ,u.
PrefetchAddr        [0x200000e8]   dcd      0x200000e8  ...
DataAbortAddr        [0x200000ec]   dcd      0x200000ec  ...
InitReset        [0xe59f10dc]   ldr      r1,0x20000110 ; = #0x200081e0
20000030        [0xe3c11003]   bic      r1,r1,#3



我执行到软中断后程序死在0x00000008:
00000000        [0xea000007]   b        0x24
00000004        [0xeafffffe]   b        0x4
00000008        [0xeafffffe]   b        0x8
0000000c        [0xeafffffe]   b        0xc
00000010        [0xeafffffe]   b        0x10
00000014        [0xeafffffe]   b        0x14
00000018        [0xe51fff20]   ldr      pc,0xfffff100 ; = #0x00105260
0000001c        [0xeafffffe]   b        0x1c
00000020        [0x00105448]   andeqs   r5,r0,r8,asr #8
00000024        [0xe59f1130]   ldr      r1,0x0000015c ; = #0xfffffc00
00000028        [0xe3e00000]   mvn      r0,#0
0000002c        [0xe5810064]   str      r0,[r1,#0x64]
00000030        [0xe3e00001]   mvn      r0,#1
00000034        [0xe5810004]   str      r0,[r1,#4]



请问为什么呢?

回复评论 (12)

汇编啊。呵呵
点赞  2008-1-23 09:51
请帮忙罗~
点赞  2008-1-23 11:44
你需要把entry处的8条指令拷贝到0地址。

你从仿真器里直接从0x20000000运行,可能是错过了某些初始化代码。
点赞  2008-1-31 18:08
你是在板子上跑的吧
问题出在你板子上0x8的软中断代码不对,应该把0x8换成一条跳转代码,跳转到0x20000008,否则就死循环了,应该象楼上的说的,你的bootloader没有执行
点赞  2008-2-19 15:42
1.请问这个地址是可变的吗?
可以变,我觉得要看你的板子的硬件环境而定。

2.00000008 [0xeafffffe]       b                 0x8

自己跳到自己怎么能不死呢...
点赞  2008-2-20 13:54
楼主你跳到死循环里面了吧?
点赞  2008-2-22 11:41
有问题请先GOOGLE,BAIDU
点赞  2008-5-1 09:29
我也想知道,正在找這方面的資料~~~~~
点赞  2008-5-1 16:04
引用: 引用楼主 tntman 的回复:
我的环境:at91rm9200+28F128+dataflash
我运行仿真器时,程序执行起点是__ENTRY,地址是0x20000000,(1)请问这个地址是可变的吗?
1ffffff4 [0xffffffff]? dci? ? ? 0xffffffff ; ? undefined
1ffffff8 [0xffffffff]? dci? ? ? 0xffffffff ; ? undefined
1ffffffc [0xffffffff]? dci? ? ? 0xffffffff ; ? undefined
__ENTRY ? ? ? ? [0xea000009]? b? ? ? ? InitReset
undefvec [0xeafffffe]? b? ? ? ? undefvec
swivec ? ? ? ? [0xe59ff010]? ldr? ? ? pc,SWI_Addr ; = #SWI_Addr
pabtvec ? ? ? ? [0xe59ff010]? ldr? ? ? pc,PrefetchAddr ; = #PrefetchAddr
dabtvec ? ? ? ? [0xe59ff010]? ldr? ? ? pc,DataAbortAddr ; = #DataAbortAddr
rsvdvec ? ? ? ? [0xeafffffe]? b? ? ? ? rsvdvec
irqvec ? ? ? ? [0xe51fff20]? ldr? ? ? pc,0x1ffff100 ; = #0xfffcecec
fiqvec ? ? ? ? [0xeafffffe]? b? ? ? ? fiqvec
SWI_Addr [0x2000752c]? dcd? ? ? 0x2000752c? ,u.
PrefetchAddr [0x200000e8]? dcd? ? ? 0x200000e8? ...
DataAbortAddr [0x200000ec]? dcd? ? ? 0x200000ec? ...
InitReset [0xe59f10dc]? ldr? ? ? r1,0x20000110 ; = #0x200081e0
20000030 [0xe3c11003]? bic? ? ? r1,r1,#3


我执行到软中断后程序死在0x00000008:
00000000 [0xea000007]? b? ? ? ? 0x24
00000004 [0xeafffffe]? b? ? ? ? 0x4
00000008 [0xeafffffe]? b? ? ? ? 0x8
0000000c [0xeafffffe]? b? ? ? ? 0xc
00000010 [0xeafffffe]? b? ? ? ? 0x10
00000014 [0xeafffffe]? b? ? ? ? 0x14
00000018 [0xe51fff20]? ldr? ? ? pc,0xfffff100 ; = #0x00105260
0000001c [0xeafffffe]? b? ? ? ? 0x1c
00000020 [0x00105448]? andeqs? r5,r0,r8,asr #8
00000024 [0xe59f1130]? ldr? ? ? r1,0x0000015c ; = #0xfffffc00
00000028 [0xe3e00000]? mvn? ? ? r0,#0
0000002c [0xe5810064]? str? ? ? r0,[r1,#0x64]
00000030 [0xe3e00001]? mvn? ? ? r0,#1
00000034 [0xe5810004]? str? ? ? r0,[r1,#4]


请问为什么呢?

你在0x08处的指令是又跳转到0x08,所以死循环了!
点赞  2010-1-22 14:29
(1)请问这个地址是可变的吗?
这个是可以改的,在你的仿真程序的某个设置项里边设置了程序下载的地址及__ENTRY地址。


00000000 [0xea000007]  b        0x24
00000004 [0xeafffffe]  b        0x4
00000008 [0xeafffffe]  b        0x8
0000000c [0xeafffffe]  b        0xc
00000010 [0xeafffffe]  b        0x10
00000014 [0xeafffffe]  b        0x14
00000018 [0xe51fff20]  ldr      pc,0xfffff100 ; = #0x00105260
0000001c [0xeafffffe]  b        0x1c
从这里可以看到,板子的启动代码中除了复位异常和IRQ异常之外都是进入死循环,因为是跳到当前位置

所以你的程序要能执行软中断的内容,然后将下载及__ENTRY地址设置成0
点赞  2010-1-22 14:49
楼上说得对,楼主异常向量大部分都不对
点赞  2010-1-24 01:32
哈哈
点赞  2010-1-29 12:32
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复