



免费预览已结束,剩余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 EQU 0x80USR32Mode EQU 0x10SVC32Mode EQU 0x13SYS32Mode EQU 0x1fIRQ32Mode EQU 0x12FIQ32Mode EQU 0x11上面几行代码,不用过多分析, 定义几个符号而已, 把EQU想像成C中的#define就可以了. 具体定义的数值,下面的代码用到我再解释.IMPORT _use_no_semihosting_swi上面这一句的作用是在代码中禁用 semihosting 机制. 到底什么是semihostiong这里不多说, 网上有很多. 这里只说明Semihosting主要用来调试, 在release版本的代码中一般是要禁用的. IMPORT FIQ_Exception IMPORT _main IMPORT TargetResetInit上面三行是把要引入的外部标号声明一下,以便下面使用. EXPORT bottom_of_heapEXPORT StackUsrEXPORT ResetEXPORT _user_initial_stackheap上面四行是把要给其它文件使用的标号声明AREA vectors,CODE,READONLY ENTRY上面这一行声明汇编文件的入口, 整个文件是从这里开始执行的. Reset LDR PC, ResetAddr LDR 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的中断向量表分布图, 这个位置是个保留位. 但是究竟为什么要用0xb9205f80这个数值呢. 根据周立功的说法, nxp系列的lpc21xx,lpc22xx片子要求中断向量表中所有数据32位累加和为0,否则程序不能脱机运行, 我在AXD反汇编了一下(如下图),把中断向量表中的8个机器码累加了一下:0xe59ff018*6+0xe51ffff0+0xb9205f80,没错, 结果是零. 但是我遇到一个问题, 就是我在实验中,把0xb9205f80这个数值改成任何值,程序运行都没问题. 头大了, 这个问题待解决中(希望高手看到了可以指点一二). 第二, 关于LDR PC, PC, #-0xff0. 这里本应该放IRQ中断的, 为什么是这么一句话. 其实在我blog的其中一篇文章里有提到过这一点. ARM7的三级流水线结构导致了PC指向的是当前指令的后8个字节. 本来IRQ是应该放在0x00000018处的. LDR PC, PC, #-0xff0这条语句执行后, PC的当前值就是0x00000018+8-0xff0. 很容易计算出它的结果是0xfffff030. 看一下lpc22xx的手册就知道. 这个地址就是VICVectAddr. 也就是说本来这个地址是应该放IRQ服务程序的入口地址的,但是这个地址被放在了VICVectAddr 这个寄存器里. 英文手册里有一段对VICVectAddr 描述. 看了之后就容易明白是怎么回事了: Vector Address Register. When an IRQ interrupt occurs, the IRQ service routine can read this register and jump to the value readResetAddr DCD ResetInitUndefinedAddr DCD UndefinedSWI_Addr DCD SoftwareInterruptPrefetchAddr DCD PrefetchAbortDataAbortAddr DCD DataAbortNouse DCD 0IRQ_Addr DCD 0FIQ_Addr DCD FIQ_Handler这几行是为上面中断向量表中的中断标号分配内存空间, 也就是它们的执行地址. 一开始我有个疑问, 为什么不直接用LDR PC, ResetInit,还要用DCD中转一下, 后来上网查了一下,才恍然大悟, ldr指令中的地址必须为当前指令地址是4KB范围内, 用DCD中转一下就可以在整个程序空间寻址. Undefined B UndefinedSoftwareInterrupt B SoftwareInterrupt PrefetchAbort B PrefetchAbortDataAbort B DataAbortFIQ_Handler STMFD SP!, R0-R3, LR BL FIQ_Exception LDMFD SP!, R0-R3, LR SUBS PC, LR, #4这几行不用过多解释, 只是说明上面几个异常如何执行.InitStack MOV R0, LR;设置管理模式堆栈 MSR CPSR_c, #0xd3 LDR SP, StackSvc ;设置中断模式堆栈 MSR CPSR_c, #0xd2 LDR SP, StackIrq;设置快速中断模式堆栈 MSR CPSR_c, #0xd1 LDR SP, StackFiq;设置中止模式堆栈 MSR CPSR_c, #0xd7 LDR SP, StackAbt;设置未定义模式堆栈 MSR CPSR_c, #0xdb LDR SP, StackUnd;设置系统模式堆栈 MSR CPSR_c, #0xdf LDR SP, =StackUsr MOV PC, R0上面是一个子函数, 函数名为InitStack. 顾名思意, 这个函数设置ARM七种工作模式下的堆栈. 关于这一段代码有三点要说.第一, MSR CPSR_c, #0xdf, 这一句把ARM的工作模式设置为系统模式,或者也可以说是用户模式, 因为系统模式与用户模式是共享相同的寄存器组. 用0xdf对CPSR寄存器赋值,就把IRQ中断关闭了(可以查一下CRSR的详细说明), 代码正常执行时处理器是处在用户模式的,所以IRQ中断是不会执行的. 所以,如果用周立功的这个启动代码,当你的程序中需要中断时,要把0xdf改成0x5f. 之前看到很多人在网上说用周立功的ADS工程模板,进不了中断,很多情况下是这个原因. 第二, 并不是每一种模式下的堆栈都用设置的, 比如说如果你的程序中不会用到FIQ,就可以不用设置快速中断下的堆栈. 第三, 注意LDR SP, =StackUsr这个语句, 其它都是没有=号的, 为什么这个要用等号呢? 这就是LDR伪指令与LDR指令的区别了, LDR SP, =StackUsr是把StackUsr表示的地址装载到sp, LDR SP, StackUnd是把StackUnd表示地址的内容装载到sp,注意下面几句StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4可以看到,没有”=”的标号都已经用DCD初始化了, 而StackUsr到底是什么呢, 它是由下面的语句决定的(startup.s文件)AREA Stacks, DATA, NOINITStackUsr(分散加载文件)STACKS 0x40002000 UNINIT Startup.o (Stacks)这样就明白了, StackUsr肯定是0x400000000x400020000之间的某个数. 用户模式下的堆栈空间就是它了. ResetInit BL InitStack BL TargetResetInit B _main处理器上电复位后通过中断向量表进入该函数,_main函数主要工作是初始化C的库函数, 并由它进入C的main函数. _user_initial_stackheap LDR r0,=bottom_of_heap; LDR r1,=StackUsrMOV pc,lr_user_initial_stackheap函数是ADS的一个库函数, 如果程序中用到的分散加载文件, 这个函数必须要被实现. 应用程序的栈和heap是在C库函数初始化过程中建立起来的。可以通过重定向对应的子程序来改变堆栈和heap的位置. 堆栈的地址在分散加载文件里已经指定好,本函数不应该修改它们的值. 用r0,r1分别返回heap和stack的基址. 关于ADS的存储器机制大家可以去网上查更详细的资料. StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4AREA MyStacks, DATA, NOINIT, ALIGN=2SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration ModeIrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend ModeUndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 上面几行代码是为各个模式下的堆栈分配空间. 其中MyStacksA的位置会在分散加载文件中指定. IF :DEF: EN_CRP IF . = 0x1fc INFO 1,nThe data at 0x000001fc must be 0x87654321.nPlease delete some source before this line. ENDIFCrpData WHILE . 0x1fc NOP WENDCrpData1 DCD 0x87654321 ;/*When the Data is 为0x87654321,user code be protected. 当此数为0x87654321时,用户程序被保护 */ ENDIF上面这几行其实是加密芯片用的, lpc21xx和lpc22xx系列的ARM7,当你的工程选择RelInFlash时, 代码写进flash,芯片也同时被加密, 加密状态下JTAG也读不到芯片, 也不能单步调试, 要解密的话必须要用ISP完全擦除一下. 上面的代码的意思就是在地址0x1fc处放数据0x8
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年快递包裹安全试题及答案(安全教育培训)
- 2025年桥梁施工单位岗前安全生产试题及答案
- 物理竞赛知识点专项试题及答案 - 动能定理
- (正式版)DB65∕T 4903-2025 《棉花秸秆成型燃料生产技术规程》
- 2026年水果种植公司科研项目立项申请管理制度
- 2025年溃疡性结肠炎护理题库及答案
- 2025年血液护理科普知识题库及答案
- 二泉映月说课稿-2025-2026学年初中音乐人教版七年级下册-人教版
- 十九 图说“梅兰竹菊”说课稿-2025-2026学年小学信息技术冀教版2022第一册-冀教版2022
- 订单查询功能的实现说课稿-2025-2026学年中职专业课-网站数据库应用技术-SQL Server-计算机类-电子与信息大类
- DBS教材03精益转换训练
- 护理实习生院感培训课件
- 五粮液企业招聘面试试题集锦:新热点问题及答案
- 餐厅入股合作协议书相模板
- 食品检测检验技术专业介绍
- 2025年26道医院财务科岗位面试真题及答案
- 新能源场站智能管理体系构建研究
- 肾上腺肿瘤切除术后护理
- (高清版)DB11∕T 2441-2025 学校食堂清洁和消毒规范
- 团支书培训大会第一讲
- 职业红蓝百家玩家深度剖析五局八星
评论
0/150
提交评论