共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |