共2条
1/1 1 跳转至页
arm 折磨了我两天的问题,关于arm地址,请大虾帮忙
问
下面是一段源文件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处。
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 跳转至页
回复
我要赚赏金打赏帖 |
|
|---|---|
| 【S32DS】S32K3 RTD7.0.1 HSE 组件配置报错问题解决被打赏¥27元 | |
| 【S32K3XX】MCME 启动 CORE1被打赏¥23元 | |
| AG32VH407下温度大气压传感器及其检测被打赏¥20元 | |
| AG32VH407下光照强度传感器BH1750及其检测被打赏¥22元 | |
| AT32VH407下使用温湿度传感器DHT22进行检测被打赏¥20元 | |
| DIY一个婴儿澡盆温度计被打赏¥34元 | |
| 【FreeRtos】FreeRtos+MPU region 配置规则被打赏¥23元 | |
| 【分享开发笔记,赚取电动螺丝刀】三分钟快速上手驱动墨水屏(ArduinoIDE)被打赏¥28元 | |
| 【S32K3XX】LIN 通讯模块使用被打赏¥31元 | |
| 【FreeRtos】FreeRtos + MPU模块的配置使用被打赏¥32元 | |
我要赚赏金
