共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
vscode+cmake搭建雅特力AT32L021开发环境被打赏30分 | |
【换取逻辑分析仪】自制底板并驱动ArduinoNanoRP2040ConnectLCD扩展板被打赏47分 | |
【分享评测,赢取加热台】RISC-V GCC 内嵌汇编使用被打赏38分 | |
【换取逻辑分析仪】-基于ADI单片机MAX78000的简易MP3音乐播放器被打赏48分 | |
我想要一部加热台+树莓派PICO驱动AHT10被打赏38分 | |
【换取逻辑分析仪】-硬件SPI驱动OLED屏幕被打赏36分 | |
换逻辑分析仪+上下拉与多路选择器被打赏29分 | |
Let'sdo第3期任务合集被打赏50分 | |
换逻辑分析仪+Verilog三态门被打赏27分 | |
换逻辑分析仪+Verilog多输出门被打赏24分 |