新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 嵌入式软件开发之: 复位和初始化

嵌入式软件开发之: 复位和初始化

作者:时间:2013-09-30来源:网络收藏

本文引用地址:http://www.eepw.com.cn/article/257026.htm

1.先搬移后映射(Remap after Copy)

图13.15显示一种典型的存储器地址重映射情况。

图13.15 ROM/RAM重映射(1)

原来RAM和ROM各有自己的地址,进行重映射以后RAM和ROM的地址都发生了变化。这种情况下,可以采用以下方案。

① 上电后,从0x0地址的ROM开始往下执行。

② 根据映射前的地址,对RAM进行必要的代码和数据拷贝。

③ 拷贝完后,进行remap操作。

④ 因为RAM在remap前准备好了内容,使得PC指针能继续在RAM里取到正确的指令。

2.先映射后搬移(Copy after Remap)

系统上电后的缺省状态是0x0地址上放有ROM。这块ROM有两个地址:从0起始和从0x10000起始,里面存储了代码。当进行地址remap以后,从0x0起始的地址被定向到RAM上,ROM则只保留有惟一的从0x10000起始的地址。

如果存储在ROM里的异常处理程序(Reset-Handler)一直在0x0~0x4000的地址上运行,则当执行完remap以后,下面的指令将从RAM里预取,这必然会导致程序执行流程的中断。根据系统特点,可以用下面的办法来解决这个问题。

① 上电后系统从0x0地址开始自动执行,设计跳转指令在remap发生前使PC指针指向0x10000开始的ROM地址中去,因为不同地址指向的是同一块ROM,所有程序能够顺利执行。

② 这时候0x0~0x4000的地址空间空闲,不被程序引用,执行remap后把RAM引进。因为程序一直在0x10000起始的ROM空间里运行,remap对运行流程没有任何影响。

③ 通过在ROM里运行的程序,对RAM进行相应的代码和数据拷贝,完成应用程序运行的

图13.16显示了ROM和RAM重映射的第二种解决方案。

图13.16 ROM/RAM重映射(2)

该ROM与RAM地址重映射的方法可以应用于任何具有ROM/RAM重映射机制的平台,但是内存重映射的地址根据具体平台的不同而不同。

图13.16显示的地址重映射例子中,第一条指令实现从ROM临时地址(0x0地址)到实际ROM的跳转。然后,控制寄存器的重映射位,清除ROM的临时地址设置。该代码通常在系统后立即执行。重新映射必须在执行C库代码前完成。

在具有MMU的系统中,可通过在系统启动时配置MMU来实现重映射。

下面的例子显示了在的Integrator开发板上实现的ROM/RAM重映射过程。

; --- Integrator CM control reg

CM_ctl_reg EQU 0x1000000C ;定义CM控制寄存器地址

Remap_bit EQU 0x04 ;CM控制寄存器重映射掩码

ENTRY

;异常处理程序开始

; 执行跳转指令,转到实际的ROM执行

LDR pc, =Instruct_2

Instruct_2

; 设置CM控制寄存器的重映射位

LDR r1, =CM_ctl_reg

LDR r0, [r1]

ORR r0, r0, #Remap_bit

STR r0, [r1]

; 重映射后,RAM在0x0地址

; 将从ROM拷贝到 RAM (由 __main函数完成)

13.5.3 局部存储器设置有关的考虑事项

许多处理器内核具有片上存储器系统,如MMU或MPU。这些设备通常是在系统启动过程中进行设置并启用的。因此,带有局部存储器系统的内核的初始化序列需要特别地考虑。

在前面所述的代码启动的过程中,__main中C库初始化代码负责建立代码执行时的内存映像,在跳转到__main前,必须建立处理器内核的运行时存储器视图。这就是说,在复位处理程序中必须设置并启用MMU或MPU。

另外,在跳转到__main前(通常在MMU/MPU设置前),必须启用紧耦合存储器TCM(Tightly coupled Memory),因为在通常情况下都是采用分散加载方法将代码和数据装入TCM。当TCM启用后,用户不必存取由TCM屏蔽的存储器。

在跳转到__main前,如果启用了Cache,可能还会遇到Cache一致性的问题,__main中的函数将程序代码从其加载域拷贝到执行域,在此过程中将指令作为数据进行处理。这样,一些指令可能被放入数据Cache中,在执行这些指令时,由于找不到地址路径而产生错误。为了避免Cache一致性的问题,在C库初始化序列执行完成后再启用Cache。

存储器相关文章:存储器原理




评论


相关推荐

技术专区

关闭