打印

中断向量表如何被拷贝到设定的0x3ff8000地址

[复制链接]
1438|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Man少|  楼主 | 2013-11-25 19:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
         AREA RamData, DATA, READWRITE
;^=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000
       ^ _ISR_STARTADDRESS ;0x33ff8000
     这里定义的内存表首地址是0x3ff8000,经过编译后被下载到norflash空间中,arm启动运行时通过拷贝到ram空间中,内存表正的是被拷贝到0x3ff8000地址了吗?
 adr r0, ResetEntry
ldr r2, BaseOfROM
cmp r0, r2
ldreq r0, TopOfROM
beq InitRam
ldr r3, TopOfROM
0
ldmia r0!, {r4-r7}
stmia r2!, {r4-r7}
cmp r2, r3
bcc %B0

sub r2, r2, r3
sub r0, r0, r2   
  
InitRam
ldr r2, BaseOfBSS
ldr r3, BaseOfZero
0
cmp r2, r3
ldrcc r1, [r0], #4
strcc r1, [r2], #4
bcc %B0

mov r0, #0
ldr r3, EndOfBSS
1
cmp r2, r3
strcc r0, [r2], #4
bcc %B1

ldr pc, =%F2  ;goto compiler address
2
BaseOfROM DCD |Image$ER_ROM1$RO$Base|
TopOfROM DCD |Image$ER_ROM1$RO$Limit|
BaseOfBSS DCD |Image$RW_RAM1$RW$Base|
BaseOfZero DCD |Image$RW_RAM1$ZI$Base|
EndOfBSS DCD |Image$RW_RAM1$ZI$Limit|

相关帖子

沙发
阿南| | 2013-11-26 07:33 | 只看该作者
这个需要仔细读代码才能清楚。
如果自己读不懂,可以找个启动代码分析的书或**先看懂

使用特权

评论回复
板凳
Man少|  楼主 | 2013-11-26 09:26 | 只看该作者
      我在ADS的armlink中设置只读代码段ro开始地址为0x30000000,rw地址没有设置,编译后ro,rw,zi段不是一段接一段连在一起的吗?那么前面声明的中断向量ramdata在哪一段中呢?是在ro段中吗?

使用特权

评论回复
地板
mbdly| | 2013-11-26 09:39 | 只看该作者
这样应该也可以吧,没试过

使用特权

评论回复
5
xinzha| | 2013-11-26 14:27 | 只看该作者
一般情况下是的,只要你调用了__main这个库函数,它在把控制权交还给c代码的main之前,会进行一系列的代码搬运以及内存初始化工作,当然还有一个大前提是要是一个正确的bootloader初始化好所有必要的模块。如果你没有调用__main,那你就得自己写加载代码,虽说麻烦点,但也不是做不到。

使用特权

评论回复
6
Man少|  楼主 | 2013-11-26 23:21 | 只看该作者
   我这样理解你看对不?
BaseOfROM DCD |Image$ER_ROM1$RO$Base|        运行时的RO只读代码段开始地址
TopOfROM DCD |Image$ER_ROM1$RO$Limit|        运行时的RO只读代码段限制地址
BaseOfBSS DCD |Image$RW_RAM1$RW$Base|        运行时的BSS数据段开始地址(初始化不为0)
BaseOfZero DCD |Image$RW_RAM1$ZI$Base|       运行时的BSS数据码段初始化为0开始地址
EndOfBSS DCD |Image$RW_RAM1$ZI$Limit|        运行时的BSS数据段结束地址
上面声明的是程序运行时的地址,相对于程序加载地址。程序加载地址是RO,BSS(RW,ZI)段紧接在一起,也就是RO段后面就是BSS段了,他们是下载到flash中的,而运行地址可以通过ADS设置(ro_base和rw_base),通常是实际在ram中运的地址。
   开始我以为上面声明在0x33ff8000的中断向量表是通过BSS中的zi段复制到ram中的,其实不然。
    AREA RamData, DATA, READWRITE
     ^ _ISR_STARTADDRESS ;0x33ff8000
    是向编译器声明,需要分配一段读写数据段,该段的地址是ram中的0x33ff8000,也就是说,如果需要访问这个数据段的任何一个数据,需要到相关的地址去访问,但这个ramData数据并不是BSS数据段,不属于rw或者zi段的范畴,所以也就不存在拷贝中断向量表到ram中的0x33ff8000地址中去的问题。


使用特权

评论回复
7
xinzha| | 2013-11-27 16:09 | 只看该作者
bss段专指初始化为0的段。另外你所说的加载地址和运行地址是一个概念吗,在标准的arm文档中,加载地址和运行地址不是一个概念。
如何加载,是否拷贝完全取决于你链接时的地址和你加载地址的关系,最好是要把加载地址和链接地址一致,比如说你完全可以把你的表放在镜像文件中的任意地址,在初始化的时候拷贝到正确地址就行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

92

帖子

1

粉丝