共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 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
分享汽车通信和多媒体总线结构被打赏20分 | |
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
NUCLEO-U083RC学习历程38+串口通过队列的方式输出两个字符串被打赏20分 | |
【我踩过的那些坑】分享一下调试一款AD芯片的遇到的“坑”被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
分享电控悬架的结构与工作原理(一)被打赏20分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 |