



下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、AT91系列微处理器启动过程的分析与实现摘要:本文讨论了ARM启动的基本过程,详细分析了其中的Remap过程和从加载时域到运行时域的转换这两个技术难点,给出了AT91系列微处理器启动过程的具体实现方法。关键词:AT91;Remap;加载时域;运行时域;启动引言在ARM程序设计中,启动代码的编写是一个及其重要的过程,由于ARM处理器的启动过程相对51单片机复杂,不仅要设置中断、初始化堆栈,还涉及到存储器的地址重映射以及重映射后中断地址的搬移、初始化主程序用到的存储区等问题,导致许多人对ARM处理器的初始化以及启动代码的编写感到较为困难。本文详细分析了At91系列微处理器的启动过程。图1Remap
2、过程图2系统初始化过程系统存储介质和地址映射开发板的Flash存储器采用ATMEL公司的AT49BV1614A,板上采用的SRAM是ISSI公司的IS61LV51216,AT91M55800A片内还集成了8K字节的片内SRAM。Flash存储器连接在AT91M55800A的片选0引脚上,SRAM连接在片选1引脚上。上电时,Flash映射地址为0x01000000,片内RAM映射地址为0x00300000,片外SRAM不可见。系统上电时,从地址0开始读取上电复位中断处理程序,进行系统初始化。此时,地址0x00000000指向的是连接在片选0的存储器器件,所以要在片选0上连接Flash。由于Fla
3、sh的运行速度相对RAM要慢,且中断处理程序在Flash中无法改动,所以,人们希望程序在RAM中运行。为此,ARM的CPU提供了Remap命令来解决这个问题,当置位M55800A的重映射控制寄存器的重映射命令位(EBI_RCR的RCB位)后,内部RAM就映射到地址0,配置EBI寄存器后,Flash的地址是0x01000000,SRAM的地址是0x02000000。这就是系统的重映射过程。启动过程的分析与实现一般而言,一个ARM的启动代码必须要完成以下部分的初始化:定义入口点、设置中断/异常向量、初始化存储系统(如果需要,进行代码的搬移)、初始化堆栈、初始化I/O设备、初始化中断中用到的变量、开
4、中断、必要时改变处理器的模式和处理器的状态、初始化C程序中用到的存储区、引导处理器进入C程序。其中的难点在于内存系统的重映射和对C程序用到的存储区进行初始化。(1)设置入口指针:启动程序首先必须定义入口指针,而且整个应用程序只有一个入口指针。(2)设置中断向量:ARM7要求中断向量表必须设置在从0地址开始,连续84字节的空间,分别是复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、IRQ、FIQ和一个保留的中断向量。由于Flash在系统Remap之前指向地址0,所以要在Flash中安排中断向量。此时,真正有用的只有位于地址0的复位向量,在此安排一条BInitreset指令,转向引导程
5、序,其余中断未用。接下来在Flash中构建一个新的中断向量表,用于在Remap之后复制到片内RAM中,采取相对寻址的方式。系统复位时,外部总线并没有被配置,此时片选0的总线等待周期是8,为了加速启动过程,可以在这时把片选0的总线等待周期设为与FlashROM相应的数值。并且配置AT91M55800的PLL,使系统从慢晶振(32768Hz)转到32MHz。由于AT91M55800A的IRQ和FIQ中断是由先进中断控制器(AIC) target=_blank class=infotextkey管理的,所以,要对AIC进行配置。将刚才构建的中断向量表复制到位于0x300000的片内RAM中,这样在R
6、emap后,重新映射到地址0的片内RAM中就有了中断向量表。(3)进行Remap。(4)初始化堆栈和寄存器:堆栈设置在AT91M55800A的片内RAM中,可以提高运行速度。系统堆栈初始化取决于用户使用了哪些中断,以及系统需要处理哪些错误类型。一般来说 target=_blank class=infotextkey管理者堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈也必须设置。进入相应的处理器模式,直接设置堆栈指针即可。(5)改变处理器模式、状态:对于不带操作系统的用户程序,系统可以处在user模式下;对于mC/OS-II,系统应当工作在svc模式下,否则无法完成任务的切换。(6)初始化C语
7、言所需的存储器空间:拷贝程序到片外RAM中,完成加载时域到运行时域的转换,初始化RW和ZI段。(7)呼叫C程序:ARM有16位THUMB和32位ARM两种指令集。使用16位的存储器可以降低成本,在这种情况下,THUMB指令集的整体执行速度比ARM32位指令集快,而且代码密度高,所以一般用THUMB编译器将C语言程序编译成16位的代码。处理器一开始总在ARM状态,可使用BX指令转换到THUMB状态呼叫C程序。难点分析Remap在Remap的过程中,存储器的地址改变时,PC指针并不会自动改变,因此,要保证Remap以后程序能够继续运行下去,必须采取非正常跳转的手段,使PC指针指向Remap后的程序
8、地址,以下是实现Remap过程的具体指令序列:ldrr12,PtInitRemap;得到Remap以后的跳转地址,存入r12ldmiar10!,r0-r9,r11;将EBI各个寄存器的设置值存入r0到r9和r11,其中r11指向EBI寄存器的基地址stmiar11!,r0-r9;将r0到r9寄存器中的数值存入r11指向的EBI各个寄存器,进行Remapmovpc,r12;跳转到位于Flashrom中的地址继续运行PtInitRemapDCDInitRemap;定义Remap后的跳转目的地址。InitRemap;这里是跳转目的地址ldrr0,=AT91C_SRAM_AFTER_REMAP_SIZ
9、E;这里是Remap后的第一条指令对上述指令的执行过程详细分析就会发现,由于ARM采用三级流水线的体系结构,在执行stmiar11!,r0-r9指令进行Remap时,movpc,r12指令已经被读取。当Remap指令结束后,pc指针开始从重映射到地址0x00的片内RAM中预取指令,但此时片内RAM并没有有效的指令。接下来执行的movpc,r12指令将标号InitRemap的地址赋值给了pc指针,实际上是使程序转移到位于Remap以后的FlashROM中去继续执行,同时这条指令断开了流水线,使流水线从InitRemap后的指令开始重新取指。这样,就保证了Remap以后,程序能够在FlashROM
10、中继续执行下去,做到了“无缝连接”。Remap过程如图1所示。从加载时域到运行时域的转换一般而言,一个程序包括只读的代码段和可读写的数据段。在ARM的集成开发环境中,只读的代码段和常量被称作RO段(ReadOnly);可读写的全局变量和静态变量被称作RW段(ReadWrite);RW段中要被初始化为零的变量被称为ZI段(ZeroInit)。对于嵌入式系统而言,程序映象都是存储在Flash存储器等一些非易失性器件中的,而在运行时,程序中的RW段必须重新装载到可读写的RAM中。这就涉及到程序的加载时域和运行时域。简单来说,程序的加载时域就是指程序烧入Flash中的状态,运行时域是指程序执行时的状态
11、。对于比较简单的情况,可以在ADS集成开发环境的ARMLINKER选项中指定ROBASE和RWBASE,告知连接器RO和RW的连接基地址。对于复杂情况,如RO段被分成几部分并映射到存储空间的多个地方时,需要创建一个称为“分布装载描述文件”的文本文件,通知连接器把程序的某一部分连接在存储器的某个地址空间。需要指出的是,分布装载描述文件中的定义要按照系统重定向后的存储器分布情况进行。在引导程序完成初始化的任务后,应该把主程序转移到RAM中去运行,以加快系统的运行速度。根据以上的设想和系统的存储器分布,本系统的分布装载文件应该如下设置。FLASH0x01000000;一个称作FLASH的加载时域,起
12、始地址0x01000000FLASH0x01000000;一个称作FLASH的运行时域,起始地址0x01000000cstartup.o(+RO,+FIRST);域中包括cstartup.o的RO段,first关键字指出本部分要放在首地址*(+RO);其余RO段也放在FLASH中。SRAM0x02000000;一个称作SRAM的运行时域,起始地址0x02000000*(+RW,+ZI);其余的RW和ZI段放在SRAM中运行。main.o(+RO,+RW,+ZI);域中包括主程序main.o的RO、RW、ZI段。告诉连接器:主程序在RAM中运行。连接器只是根据装载文件的描述将程序的各部分分段连接
13、,最后生成一个可以烧入Flash的加载时域文件映象。从加载时域到运行时域的转换由系统引导程序完成,所以,启动代码必须进行数据和代码搬移工作,以完成该转换。在ADS中,系统提供了缺省的系统函数为用户进行程序和数据的搬移,不需要再由用户在自己的程序中添加数据搬移代码。这一部分是由系统函数_main完成的,_main根据分布装载文件完成代码和数据的复制,并把ZI数据区清零。接着_main跳进_rt_entry,进行STACK和HEAP等的初始化。最后_rt_entry才调用应用程序的入口main(),进入真正的用户程序中去。当应用程序执行完时,_rt_entry又将控制权交还给调试器。整个系统的初始化过程如图2所示。当用户使用分布装载功能时,必须重调用系统函数_user_initial_stackheap(),否则连接器会报错。图2中C库函数部分由系统在连接时自动加入,用户代码部分的_user_initial_stackheap()和$sub$main()在需要时可由用户改变。这时,系统的控制权已经交给用户编写的应用程序,启动过程结束。结语本启动代码已经在AT91M55800A上调试通过。随着32位ARM处理器的广泛应用,越来越多的工程技术人员开始进行ARM的开发,本文介绍的一些方法和注意点有助于开发人员理
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年张家口货运资格证考试有哪些项目
- 加工衣服合同范本
- 2025年重庆货运从业资格证模拟考试保过版
- 买方解除合同范本
- 个人服装采购合同范本
- 个人庭院出租合同范本
- 基槽土夹石换填施工方案
- 临沂制砂机采购合同范本
- 免责任劳务合同范本
- 买卖农村房屋合同范本
- 2025年湖南工业职业技术学院单招职业倾向性测试题库含答案
- 社会企业参与养老服务的模式与效果
- 人教版地理七年级下册7.1.1 亚洲的自然环境(课件33张)
- 《Python程序设计基础教程(微课版)》全套教学课件
- GB 39752-2024电动汽车供电设备安全要求
- GB/T 3452.1-2005液压气动用O形橡胶密封圈第1部分:尺寸系列及公差
- 涂料色浆MSDS
- 小学生幽默搞笑相声台词
- A4方格纸-无需排版直接打印完美版
- 湘教版六年级下册美术第2课《俯仰之间》教案
- 大蒜生长记录ppt课件
评论
0/150
提交评论