wonderwang
驱动牛犊
驱动牛犊
  • 注册日期2002-10-29
  • 最后登录2004-07-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1444回复:2

求助:ARM从ROM中启动的问题

楼主#
更多 发布于:2003-05-21 14:53
当ARM从ROM中启动的时候,ROM的起始地址为0x00000000,当ROM和RAM的初始化完成之后,ROM的起始地址为0x02000000。
那么,这个REMAP的过程是怎样实现的,同时还能保证代码的执行不受影响?
我看了一个示例代码,但是看不太懂。
哪位大虾能解释一下这段代码,谢谢!

Reset_Handler_ROM:

##     if ((*NCC_MEM).mem_cs0_csar.bits.v == 1)
        LDR     R0, =MEM_CS0_CSAR
        LDR     R1, [R0]
        ANDS    R1, R1, #1
        BEQ     Reset_Handler
      
##     if ((*NCC_MEM).mmcr.bits.refcnt != 0)
        LDR     R0, =MEM_MMCR
        LDR     R1, =MEM_MMCR_m
        LDR     R2, [R0]
        ANDS    R2, R2, R1
        BNE     Reset_Handler

        LDR     R0, =0x2000000
        CMP     R0, PC
        BLT     Reset_Handler

        ADD     R0, PC, R0
        BX      R0

# We now need to normalize the PC to the ROM Base address
## if the ROM base address is cacheable.  Cacheable ROM lives
# above address 0x0a000000

        LDR     R0, =0x2000000
        LDR     R1, =0x0a000000
        CMP     R0, R1
        BNE     Reset_Handler

        LDR     R1, =0x08000000
        ADD     R0, PC, R1
        BX      R0

        .globl  Reset_Handler
Reset_Handler:
# First we need to initialize the Mode and disable interrupts.
I wonder everything.
heiguo2001
驱动牛犊
驱动牛犊
  • 注册日期2002-12-07
  • 最后登录2005-09-15
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-24 19:02
重新设置memory CS片选的值,就可以实现重新映射到新的地址上了
具体CS值则要看文档了
还有重映射后,要保证你的代码的执行地址和映射地址相匹配

wonderwang
驱动牛犊
驱动牛犊
  • 注册日期2002-10-29
  • 最后登录2004-07-17
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-25 11:58
LDR R0, =0x2000000
CMP R0, PC
BLT Reset_Handler

ADD R0, PC, R0
BX R0
这段代码的作用应该是将当前的PC值加了0x2000000

现在的问题是,在没有设置CS之前,ROM的基地址是0
而0x2000000这个地址是没有内容的,那么程序如何继续执行下去呢?

I wonder everything.
游客

返回顶部