郑州铁路职业技术学院 无线电协会
http://wxdxh.net/
http://wxdxh.net/
http://wxdxh.net/
http://wxdxh.net/
1
理解启动代码 (ADS)
所谓启动代码 , 就是处理器在启动的时候执行的一段代码 , 主要任务是初始化
处理器模式 , 设置堆栈 , 初始化变量等等 . 由于以上的操作均与处理器体系结构和
系统配置密切相关 , 所以一般由汇编来编写 .
具体 到 S64, 启动代码分成两部分 , 一是 与 ARM7TDM I 内核相关的部分 , 包括处理
器各异常向量的配置 , 各处理器模式的堆栈设置 , 如有必要 , 复制向量到 RAM, 以
便 rema p 之后处理器正确处理异常 , 初始化数据 ( 包 括 R W 与 ZI), 最后跳转 到 Main.
二是与处理器外部设备相关的部分 , 这和厂商的联系比较大 . 虽然都采用 了
ARM7TDMI 的内核 , 但是不同的厂家整合了不同的片上外设 , 需要不同的初始化 ,
其中比较重要的是初始化 WDT, 初始化各子系统时钟 , 有必要的话 , 进行 remap. 这
一部分与一般控制器的初始化类似 , 因此 , 本文不作重点描述 .
在进行分析之前 , 请确认如下相关概念 :
S64 片上 FLASH 起始于 0x100000, 共 64kB, 片上 RAM 起始于 0x200000, 共 16kB.
S64 复位之后 , 程序会从 0 开始执行 , 此时 FLASH 被映射到 0 地址 , 因此 ,S64 可以
取得指令并执行 . 显然 , 此时还是驻留在 0x100000 地址 . 如果使用 remap 命令 , 将
会把 RAM 映射到 0 地址 , 同样的这时 0 地址的内容也只是 RAM 的镜像 .
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
B .
DABTHANDLER