- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
理解ARM启动代码(ADS)
理解启动代码(ADS)
所谓启动代码,就是处 器在启动的时候执行的一段代码,主要任务是初始化处 器模
式,设置堆栈,初始化变量等等.由于以上的操作均与处 器体系结构和系统配置密切相关,所
以一般由汇编来编写.
具体到S64,启动代码分成两部分,一是与ARM7TDMI 内核相关的部分,包括处理器各异常
向量的配置,各处理器模式的堆栈设置,如有必要,复制向量到 RAM,以便 remap 之后处理器
正确处 异常,初始化数据(包括 RW 与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
B .
请注 ,B 指令经汇编后会替换为当前 PC 值加上一个修正值(+/-),所以这条指令是代码位置
无关的,也就是不管这条指令是在 0 地址还是在 0x100000 执行,都能跳转到指定的位置,而
LDR PC,=???将向PC直接装载一个标号的值,请注 ,标号在编译过后将被替换为一个与RO
相对应的值,也就是说,这样的指令无论在哪里执行,都只会跳转到一个指定的位置.下面举一
个具体的例子来说明两者的区别:
假定有如下程序:
RESET
B INIT 或者 LDR PC, =INIT
…
INIT
…
其中RESET 为起始时的代码,也就是这条代码的偏移为0,设INIT 的偏移量为offset.
如果将这段程序按照RO=0x1000000编译, 那么B INIT 可理解为ADD PC, PC, #offset,
而 LDR PC,=INIT 可被理解为 MOV PC,#(RO+offset) .显然当系统复位时,程序
文档评论(0)