理解启动代码(ADS)
所谓启动代码,就是处理器在启动的时候执行的一段代码,主要任务是初始化
处理器模式,设置堆栈,初始化变量等等.由于以上的操作均与处理器体系结构和系
统配置密切相关,所以一般由汇编来编写.
具体到 S64,启动代码分成两部分,一是与 ARM7TDMI 内核相关的部分,包括处
理器各异常向量的配置,各处理器模式的堆栈设置,如有必要,复制向量到 RAM,以便
remap 之后处理器正确处理异常,初始化数据(包括 RW 与 ZI),最后跳转到 Main.二
是与处理器外部设备相关的部分,这和厂商的联系比较大.虽然都采用了 ARM7TDMI
的内核,但是不同的厂家整合了不同的片上外设,需要不同的初始化,其中比较重要
的是初始化 WDT,初始化各子系统时钟,有必要的话,进行 remap.这一部分与一般控
制器的初始化类似,因此,本文不作重点描述.
在进行分析之前,请确认如下相关概念:
1) S64 片上 FLASH 起始于 0x100000,共 64kB,片上 RAM 起始于 0x200000,
共 16kB.
2) S64 复位之后,程序会从 0 开始执行,此时 FLASH 被映射到 0 地址,因
此,S64 可以取得指令并执行.显然,此时还是驻留在 0x100000 地址.
如果使用 remap 命令,将会把 RAM 映射到 0 地址,同样的这时 0 地址的
内容也只是 RAM 的镜像.
3) S64 的 FLASH 可以保证在最差情况时以 30MHz 进行单周期访问,而 RAM
可以保证在最大速度时的单周期访问.
OK,以下开始分析启动代码.
一,处理器异常
S64 将异常向量至于 0 地址开始的几个直接,这些是必需要处理的.由于复位向
量位于 0,也需要一条跳转指令.具体代码如下:
RESET
B SYSINIT ; Reset
B UDFHANDLER ; UNDEFINED
B SWIHANDLER ; SWI
B PABTHANDLER ; PREFETCH ABORT
B DABTHANDLER ; DATA ABORT
B . ; RESERVED
B VECTORED_IRQ_HANDLER
B . ; ADD FIQ CODE HERE
UDFHANDLER
B .
SWIHANDLER
B .
PABTHANDLER