资源描述:
《周立功lpc2xxx系列arm7启动代码分析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ARM7的启动代码分析网上那一份相比,我这个主要关注startup.s文件.网上那个startup.s几乎是一笔带过的.红色标记的是源码. SVC_STACK_LEGTH EQU 0FIQ_STACK_LEGTH EQU 0IRQ_STACK_LEGTH EQU 256ABT_STACK_LEGTH EQU 0UND_STACK_LEGTH EQU 0NoInt
2、 EQU0x80USR32Mode EQU0x10SVC32Mode EQU0x13SYS32Mode EQU0x1fIRQ32Mode EQU0x12FIQ32Mode EQU0x11 上面几行代码,不用过多分析,定义几个符号而已,把EQU想像成C中的#define就可以了.具体定义的数值,下面的代码用到我再解释.IMPORT__use_no_semihosting_swi上面这一句的作用是在代码中禁用semihosting机制.到底什么是semihostiong这里不多说,网上有很多.这
3、里只说明Semihosting主要用来调试,在release版本的代码中一般是要禁用的.IMPORT FIQ_Exception IMPORT __main IMPORT TargetResetInit上面三行是把要引入的外部标号声明一下,以便下面使用.EXPORT bottom_of_heapEXPORT StackUsrEXPORT ResetEXPORT__user_initial_stackheap上面四行是
4、把要给其它文件使用的标号声明 AREA vectors,CODE,READONLY ENTRY上面这一行声明汇编文件的入口,整个文件是从这里开始执行的.Reset LDR PC,ResetAddr LDR PC,UndefinedAddr LDR PC,SWI_Addr LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80
5、 LDR PC,[PC,#-0xff0] LDR PC,FIQ_Addr上面几行是配置中断向量表.中断向量表的顺序是不能变的,因为这是ARM7规定的,可以参考相关书籍.这里有几个问题要说明一下.第一,关于DCD 0xb9205f80,按照ARM7的中断向量表分布图,这个位置是个保留位.但是究竟为什么要用0xb9205f80这个数值呢.根据周立功的说法,nxp系列的lpc21xx,lpc22xx片子要求"中断向量表中所有数据32位累加和为0,否则程序不能脱机运行",我在
6、AXD反汇编了一下(如下图),把中断向量表中的8个机器码累加了一下:0xe59ff018*6+0xe51ffff0+0xb9205f80,没错,结果是零.但是我遇到一个问题,就是我在实验中,把0xb9205f80这个数值改成任何值,程序运行都没问题.头大了,这个问题待解决中……(希望高手看到了可以指点一二). 第二,关于LDR PC,[PC,#-0xff0].这里本应该放IRQ中断的,为什么是这么一句话.其实在我blog的其中一篇文章里有提到过这一点.ARM7的三级流水线结构导致了PC指向的是当前
7、指令的后8个字节.本来IRQ是应该放在0x00000018处的.LDR PC,[PC,#-0xff0]这条语句执行后,PC的当前值就是0x00000018+8-0xff0.很容易计算出它的结果是0xfffff030.看一下lpc22xx的手册就知道.这个地址就是VICVectAddr.也就是说本来这个地址是应该放IRQ服务程序的入口地址的,但是这个地址被放在了VICVectAddr这个寄存器里.英文手册里有一段对VICVectAddr描述.看了之后就容易明白是怎么回事了:VectorAddressR
8、egister.WhenanIRQinterruptoccurs,theIRQserviceroutinecanreadthisregisterandjumptothevalueread ResetAddr DCD ResetInitUndefinedAddr DCD UndefinedSWI_Addr DCD SoftwareInterruptPrefetch