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

[复制链接]
1829|6
 楼主| Man少 发表于 2013-11-25 19:39 | 显示全部楼层 |阅读模式
         AREA RamData, DATA, READWRITE
;^=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000
       ^ _ISR_STARTADDRESS ;0x33ff8000
     这里定义的内存表首地址是0x3ff8000,经过编译后被下载到norflash空间中,arm启动运行时通过拷贝到ram空间中,内存表正的是被拷贝到0x3ff8000地址了吗?
  1. adr r0, ResetEntry
  2. ldr r2, BaseOfROM
  3. cmp r0, r2
  4. ldreq r0, TopOfROM
  5. beq InitRam
  6. ldr r3, TopOfROM
  7. 0
  8. ldmia r0!, {r4-r7}
  9. stmia r2!, {r4-r7}
  10. cmp r2, r3
  11. bcc %B0

  12. sub r2, r2, r3
  13. sub r0, r0, r2   
  14.   
  15. InitRam
  16. ldr r2, BaseOfBSS
  17. ldr r3, BaseOfZero
  18. 0
  19. cmp r2, r3
  20. ldrcc r1, [r0], #4
  21. strcc r1, [r2], #4
  22. bcc %B0

  23. mov r0, #0
  24. ldr r3, EndOfBSS
  25. 1
  26. cmp r2, r3
  27. strcc r0, [r2], #4
  28. bcc %B1

  29. ldr pc, =%F2  ;goto compiler address
  30. 2
  1. BaseOfROM DCD |Image$ER_ROM1$RO$Base|
  2. TopOfROM DCD |Image$ER_ROM1$RO$Limit|
  3. BaseOfBSS DCD |Image$RW_RAM1$RW$Base|
  4. BaseOfZero DCD |Image$RW_RAM1$ZI$Base|
  5. 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 | 显示全部楼层
这样应该也可以吧,没试过
xinzha 发表于 2013-11-26 14:27 | 显示全部楼层
一般情况下是的,只要你调用了__main这个库函数,它在把控制权交还给c代码的main之前,会进行一系列的代码搬运以及内存初始化工作,当然还有一个大前提是要是一个正确的bootloader初始化好所有必要的模块。如果你没有调用__main,那你就得自己写加载代码,虽说麻烦点,但也不是做不到。
 楼主| 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地址中去的问题。


xinzha 发表于 2013-11-27 16:09 | 显示全部楼层
bss段专指初始化为0的段。另外你所说的加载地址和运行地址是一个概念吗,在标准的arm文档中,加载地址和运行地址不是一个概念。
如何加载,是否拷贝完全取决于你链接时的地址和你加载地址的关系,最好是要把加载地址和链接地址一致,比如说你完全可以把你的表放在镜像文件中的任意地址,在初始化的时候拷贝到正确地址就行了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

92

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部