周立功lpc2xxx系列arm7启动代码分析

周立功lpc2xxx系列arm7启动代码分析

ID:12872104

大小:49.88 KB

页数:5页

时间:2018-07-19

周立功lpc2xxx系列arm7启动代码分析_第1页
周立功lpc2xxx系列arm7启动代码分析_第2页
周立功lpc2xxx系列arm7启动代码分析_第3页
周立功lpc2xxx系列arm7启动代码分析_第4页
周立功lpc2xxx系列arm7启动代码分析_第5页
资源描述:

《周立功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      EQU0x80USR32Mode  EQU0x10SVC32Mode  EQU0

2、x13SYS32Mode  EQU0x1fIRQ32Mode  EQU0x12FIQ32Mode  EQU0x11 上面几行代码,不用过多分析,定义几个符号而已,把EQU想像成C中的#define就可以了.具体定义的数值,下面的代码用到我再解释.IMPORT__use_no_semihosting_swi上面这一句的作用是在代码中禁用semihosting机制.到底什么是semihostiong这里不多说,网上有很多.这里只说明Semihosting主要用来调试,在release版本的代码中一般是要禁用的.IMPORT FIQ_Exception                   IMP

3、ORT __main                            IMPORT TargetResetInit上面三行是把要引入的外部标号声明一下,以便下面使用.EXPORT bottom_of_heapEXPORT StackUsrEXPORT ResetEXPORT__user_initial_stackheap上面四行是把要给其它文件使用的标号声明 AREA   vectors,CODE,READONLY       ENTRY上面这一行声明汇编文件的入口,整个文件是从这里开始执行的.Reset       LDR    PC,ResetAddr       LDR    

4、PC,UndefinedAddr       LDR    PC,SWI_Addr       LDR    PC,PrefetchAddr       LDR    PC,DataAbortAddr       DCD    0xb9205f80       LDR    PC,[PC,#-0xff0]       LDR    PC,FIQ_Addr上面几行是配置中断向量表.中断向量表的顺序是不能变的,因为这是ARM7规定的,可以参考相关书籍.这里有几个问题要说明一下.第一,关于DCD    0xb9205f80,按照ARM7的中断向量表分布图,这个位置是个保留位.但是究竟为什么要用0

5、xb9205f80这个数值呢.根据周立功的说法,nxp系列的lpc21xx,lpc22xx片子要求"中断向量表中所有数据32位累加和为0,否则程序不能脱机运行",我在AXD反汇编了一下(如下图),把中断向量表中的8个机器码累加了一下:0xe59ff018*6+0xe51ffff0+0xb9205f80,没错,结果是零.但是我遇到一个问题,就是我在实验中,把0xb9205f80这个数值改成任何值,程序运行都没问题.头大了,这个问题待解决中……(希望高手看到了可以指点一二).  第二,关于LDR    PC,[PC,#-0xff0].这里本应该放IRQ中断的,为什么是这么一句话.其实在我blo

6、g的其中一篇文章里有提到过这一点.ARM7的三级流水线结构导致了PC指向的是当前指令的后8个字节.本来IRQ是应该放在0x00000018处的.LDR    PC,[PC,#-0xff0]这条语句执行后,PC的当前值就是0x00000018+8-0xff0.很容易计算出它的结果是0xfffff030.看一下lpc22xx的手册就知道.这个地址就是VICVectAddr.也就是说本来这个地址是应该放IRQ服务程序的入口地址的,但是这个地址被放在了VICVectAddr这个寄存器里.英文手册里有一段对VICVectAddr描述.看了之后就容易明白是怎么回事了:VectorAddressRegi

7、ster.WhenanIRQinterruptoccurs,theIRQserviceroutinecanreadthisregisterandjumptothevalueread ResetAddr          DCD    ResetInitUndefinedAddr      DCD    UndefinedSWI_Addr           DCD    SoftwareInterruptPrefetch

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。