这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » arm 折磨了我两天的问题,关于arm地址,请大虾帮忙

共2条 1/1 1 跳转至

arm 折磨了我两天的问题,关于arm地址,请大虾帮忙

院士
2006-09-17 18:14:16     打赏
arm 折磨了我两天的问题,关于arm地址,请大虾帮忙



关键词: 折磨     两天     问题     关于     地址     大虾     帮忙    

院士
2006-12-22 22:43:00     打赏
2楼
问 下面是一段源文件init.s中的与地址重映射相关的代码
init.s主要包含复位异常中断处理程序,
;下面4条伪操作定义了在需要进行rom/ram重映射的情况下,当
; 地址重映射之后的ROM起始地址,在系统复位时rom起始地
;址为0x0,接着在ROM的前几条代码进行地址的重映射,将地 址设为ROM_START

init.s代码如下:

...        ;这里进行一些符号的定义,如ram的最高地址,各种处理器模式等

ROM_STATR EQU 0X04000000

INSTRUCT_2 EQU ROM_STATR+4 ;ROM中的第2条指令

ResetBase EQU 0X0B000000 ;地址重映射控制器的基地址

ClearResetMap EQU ResetBase+0X20;

ENTRY

IF:DEF:ROM_RAM_REMAP

LDR PC,=INSTRUCT_2       ?????

MOV R0,#0                ;开始进行重映射

LDR R1,=ClearResetMap

STRB R0,[R1]

ENDIF

...  ;这里开始复位异常中断处理程序

(***init.o这个模块在连接时被指定为rom中的first段***)

在以上的代码中,我标了问号的那行有什么意义?? 它只是跳转带到rom中的第2条指令去执行~就是说它跳转到MOV R0,#0 去执行,这不是多此一举吗,直接把MOV R0,#0放到第一条不就开始了重映射的处理过程了吗?。



一般来说异常中断向量表是被固化在rom的0地址处的,可是此时rom的0地址处
明显不是异常中断向量表,而是一段实现重映射的代码,那么复位异常在这里岂不是没有通过异常中断向量表去进入吗?


这两个问题我两天了都没想通,学ARM不久,到这里实在看不下去了,搞的这两天心情都不好了,请大虾们能仔细看看我的问题,不吝指教,先谢了。 1: 个人理解ROM_STATR EQU 0X04000000

INSTRUCT_2 EQU ROM_STATR+4 ;ROM中的第2条指令

IF:DEF:ROM_RAM_REMAP   // 编译的时候根据是否定义remap编译这段

LDR PC,=INSTRUCT_2       ?????



所以我觉得是为了remap用的,假设你定义的装载地址不是0,或者其他什么条件 2: INSTRUCT_2 EQU ROM_STATR+4 并不是烧写之后rom中的第2条指令啊INSTRUCT_2 EQU ROM_STATR+4 并不是烧写之后rom中的第2条指令啊
只读的代码段会放在数据的前面~所以第2条指令应该是MOV R0,#0吧
可是我不晓得为什么要调用LDR PC,=INSTRUCT_2,还有,在还没进行完重映射的时候去使用0x04000000地址得到的是什么? rom此时不是被映射到0x0了吗 3: 回复主题:折磨了我两天的问题,关于ARM地址,请大虾帮忙复位时有两个地址0x00, 0x400000映射到rom的首单元,
LDR PC,=INSTRUCT_2 执行时,MOV R0,#0已进入CPU, PC = 0x08;
LDR PC,=INSTRUCT_2 执行后,PC = 0x400000 + 4;  原先进来的的MOV R0,#0被丢弃,根据当前PC直,MOV R0,#0又重新进来,之后就往下执行,0x00被映射到RAM, 现在只剩下0x400000映射到rom。


STRB R0,[R1]
;; 这里必有一段代码将异常中段表从ROM中copy到RAM的0x00处。此时0x00已经映射到ram。

ENDIF


如果没有定义ROM_RAM_REMAP, 则
IF:DEF:ROM_RAM_REMAP
。。。。。。
ENDIF

这段重映射代码没有,则异常中段表就位于ROM的0x00处。此时0x00是映射到rom的。

4: 回复主题:折磨了我两天的问题,关于ARM地址,请大虾帮忙无论如何,异常中段表都会在0x00处。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]