ARM启动及工作模式切换_第1页
ARM启动及工作模式切换_第2页
ARM启动及工作模式切换_第3页
ARM启动及工作模式切换_第4页
ARM启动及工作模式切换_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ARM 启动及工作模式切换一、原理 如何让嵌入式系统快速稳定地启动是一个重要问题。嵌入式系统的资源有限,程序通常都是固化在ROM 中运行。但在实际应用中,为提高系统的实时性,加快代码的执行速度,系统启动后程序往往要被搬移到RAM 中,因为RAM 的存取速度要比ROM 快得多,这样大大提升系统的性能。启动程序要完成的任务包括:硬件初始化,系统存储系统的配置,复制二级中断向量表。二、启动程序过程 系统硬件初始化系统上电或复位后,程序从位于地址0x0 的Reset Exception Vector 处开始执行,因此需要在这里放置Bootloader 的第一条指令:b ResetHandler,跳转到标号为ResetHandler 处进行第一阶段的硬件初始化,主要内容为:关看门狗定时器,关中断,初始化PLL 和时钟,初始化存储器系统。执行完以上程序后,系统进行堆栈和存储器的初始化。系统堆栈初始化取决于用户使用了哪些中断,以及系统需要处理哪些错误类型。一般情况下,管理者堆栈必须设置,如果使用了IRQ 中断,则IRQ 堆栈也必须设置。如果系统使用了外设,则需要设置相关的寄存器,以确定其刷新频率、总线宽度等信息。 代码段复制到RAM 中运行因为嵌入式系统的代码通常都是固化在ROM或者Flash 中,上电后开始运行。由于ROM和Flash 的读取速度相对较慢,这样无疑会降低代码的执行速度和系统的运行效率。为此,需要把系统的代码复制到RAM 中运行。使用SDT 链接器ARMLink 产生的定位信息,把RO 的有效代码和数据段到RAM 中。ARMLink 将编译后的程序链接成ELF 文件。映像文件内部共有三种输出段:RO 段、RW 段和ZI 段。这三种输出段分别包含了只读代码及包含在代码段中的少量数据、可读写的数据、初始化为0 的数据,ARMLink 同时还产生了这三种输出段的起始和终止定位信息: Image$RO$Base 、Image$RO$Limit 、image$RW$Base、Image$Limit、Image$Linit 和Image$ZI$Limit。可以在程序中使用这些定位信息。将ROM 中的代码和数据搬移到RAM 中。 建立二级中断向量表在ARM 系统中,中断向量表位于0x 开始的地址处,意味着无论运行什么样的上层软件,一旦发生中断,程序就得到Flash 存储器中的中断向量表里去,降低系统的运行效率。因此在RAM 中建立自己的二级中断向量表,当中断发生后,程序直接从RAM 中取中断向量进入中断子程序。尤其是在中断频繁发生的系统里,这种方法可以大大提高系统的运行效率。 MMU 的应用MMU 是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU 通常是CPU的一部分,本身有少量存储空间存放从虚拟地址到物理地址的匹配表,此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU 决定数据是在RAM 内还是在大容量外部存储器设备内。如果数据不在存储空间内,MMU 将产生页面错误中断。MMU 存储器系统的结构允许对存储器系统的精细控制,大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB1MB 的各种存储器区域的属性。MMU 完成的两个主要功能是:将虚地址转换成物理地址,控制存储器存取允许。MMU 关掉时,虚地址直接输出到物理地址总线。SDRAM 地址分配三、启动代码完成的主要功能1) 建立异常中断的入口向量2) 建立中断向量表3) 为ARM 每种运行模式设置堆栈4) 初始化ARM 的MPLL 时钟5) 初始化MMU(内存管理单元)6) 初始化存储器控制器7) 关闭看门狗、关闭中断8) 判断IRQ 中断的中断入口9) 将RW 段的内容从flash 拷贝到SDRAM,初始化ZI 段为010) 跳转到应用程序(C 代码)四、S3C2410 初始化说明1 创建中断向量表中断向量表创建到SDRAM 高位地址上,主要是因为SDRAM 的地址位置需要放置执行的映象程序,而且在SDRAM 中查找向量表速度会快很多。中断向量表放置时需要字对齐。 ALIGN ;通过添加补丁字节使当前位置满足一定的对齐方式 ;可读写的数据段 AREA RamData, DATA, READWRITE;=MAP:定义一个结构化的内存表(storage map)的首地址,地址为0x33ff8000 _ISR_STARTADDRESS ;0x33ff8000HandleReset # 4 ;#Field:定义一个结构化内存表中的数据域,该域为4 个字节HandleUndef # 4HandleSWI # 4HandlePabort # 4HandleDabort # 4HandleReserved # 4HandleIRQ # 4HandleFIQ # 4;Dont use the label IntVectorTable,;The value of IntVectorTable is different with the address you think it may be.;IntVectorTableHandleEINT0 # 4HandleEINT1 # 4HandleEINT2 # 4HandleEINT3 # 4HandleEINT4_7 # 4HandleEINT8_23 # 4HandleRSV6 # 4HandleBATFLT # 4HandleTICK # 4HandleWDT # 4HandleTIMER0 # 4HandleTIMER1 # 4HandleTIMER2 # 4HandleTIMER3 # 4HandleTIMER4 # 4HandleUART2 # 4HandleLCD # 4HandleDMA0 # 4HandleDMA1 # 4HandleDMA2 # 4HandleDMA3 # 4HandleMMC # 4HandleSPI0 # 4HandleUART1 # 4HandleRSV24 # 4HandleUSBD # 4HandleUSBH # 4HandleIIC # 4HandleUART0 # 4HandleSPI1 # 4HandleRTC # 4HandleADC # 42 创建异常中断的入口函数b ResetHandlerb HandlerUndef ;handler for Undefined modeb HandlerSWI ;handler for SWI interruptb HandlerPabort ;handler for PAbortb HandlerDabort ;handler for DAbortb . ;reservedb HandlerIRQ ;handler for IRQ interruptb HandlerFIQ ;handler for FIQ interrupt异常向量的入口函数是由8 个跳转指令组成的,这8 个跳转指令需要按照顺序放置到固定的地址上,地址是0x000x1c,这8 个跳转指令是ARM 汇编指令,所以条指令占4 个字节的位置。3 关闭看门狗、关闭中断ldr r0,=WTCON ;watch dog disableldr r1,=0x0str r1,r0ldr r0,=INTMSKldr r1,=0xffffffff ;all interrupt disablestr r1,r0ldr r0,=INTSUBMSKldr r1,=0x3ff ;all sub interrupt disablestr r1,r04 设置ARM 的主时钟频率;To reduce PLL lock time, adjust the LOCKTIME register.ldr r0,=LOCKTIMEldr r1,=0xffffffstr r1,r0;Configure MPLLldr r0,=MPLLCONldr r1,=(M_MDIV12)+(M_PDIV4)+M_SDIV) ;Fin=12MHz,Fout=50MHzstr r1,r05 设置存储器控制器 ;Set memory control registers adr r0, SMRDATA ldr r1,=BWSCON ;BWSCON Address add r2, r0, #52 ;End address of SMRDATA 一共13 个寄存器0 ldr r3, r0, #4 str r3, r1, #4 cmp r2, r0 bne %B0LTORG ;声明一个数据缓冲池的开始SMRDATA DATADCD 0x2211D110 ; BWSCONDCD 0x0700 ; BANKCON0DCD 0x7FFC ; BANKCON1DCD 0x0700 ; BANKCON2DCD 0x0700 ; BANKCON3DCD 0x0700 ;BANKCON4DCD 0x0700 ;BANKCON5DCD 0x18005 ;BANKCON6DCD 0x18005 ; BANKCON7DCD 0x008E0459 ;REFRESHDCD 0x32 ;BANKSIZE=0x32DCD 0x30 ;MRSR6 CL=3clkDCD 0x30 ;MRSR7以上是对S3C2410A 的存储器进行初始化,存储器的初始化是和具体的硬件平台相关的,具体的内容见S3C2410A 的使用手册。6 堆栈初始化及ARM 工作模式转换UserStack EQU (_STACK_BASEADDRESS-0x3800) ;0x33ff4800 SVCStack EQU (_STACK_BASEADDRESS-0x2800) ;0x33ff5800 UndefStack EQU (_STACK_BASEADDRESS-0x2400) ;0x33ff5c00 AbortStack EQU (_STACK_BASEADDRESS-0x2000) ;0x33ff6000 IRQStack EQU (_STACK_BASEADDRESS-0x1000) ;0x33ff7000 FIQStack EQU (_STACK_BASEADDRESS-0x0) ;0x33ff8000 InitStacks;UndefMode 堆栈mrs r0,cpsrbic r0,r0,#MODEMASKorr r1,r0,#UNDEFMODE|NOINTmsr cpsr_cxsf,r1 ;UndefModeldr sp,=UndefStack;AbortMode 堆栈orr r1,r0,#ABORTMODE|NOINTmsr cpsr_cxsf,r1 ;AbortModeldr sp,=AbortStack;IRQMode 堆栈orr r1,r0,#IRQMODE|NOINTmsr cpsr_cxsf,r1 ;IRQModeldr sp,=IRQStack;FIQMode 堆栈orr r1,r0,#FIQMODE|NOINTmsr cpsr_cxsf,r1 ;FIQModeldr sp,=FIQStack;SVCMode 堆栈bic r0,r0,#MODEMASK|NOINTorr r1,r0,#SVCMODEmsr cpsr_cxsf,r1 ;SVCModeldr sp,=SVCStackmov pc,lr7 将RW 内容从flash 中copy 到SDRAM 中,并将ZI 内容初始化为0 adr r0, ResetEntry ldr r2, BaseOfROM cmp r0, r2 ldreq r0, TopOfROM beq InitRam ldr r3, TopOfROM;将RO 区域的代码copy 到RW 域中并且将ZI 区域初始化为0。0 ldmia r0!, stmia r2!, cmp r2, r3 bcc %B0 sub r2, r2, r3 sub r0, r0, r2InitRam ldr r2, BaseOfBSS ldr r3, BaseOfZero0 cmp r2, r3 ;copy 初始化代码 ldrcc r1, r0, #4 strcc r1, r2, #4 bcc %B0 mov r0, #0 ;初始化ZI 区域为0 ldr r3, EndOfBSS

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论