Mini2440启动代码的编写(第三版)

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

Mini2440Mini2440Mini2440Mini2440开发板学习笔记开发板学习笔记开发板学习笔记开发板学习笔记文档名称:文档名称:文档名称:文档名称:Mini2440Mini2440Mini2440Mini2440启动代码的编写(第三版)启动代码的编写(第三版)启动代码的编写(第三版)启动代码的编写(第三版)完成日期:完成日期:完成日期:完成日期:2010201020102010年年年年05050505月月月月08080808日日日日作作作作者:冯伟者:冯伟者:冯伟者:冯伟版权归作者所有,未经允许请勿将本文档所有或部分内容出版或用于其它商业用途版本修改记录第三版:1.1.1.1.修改了软中断异常处理函数的代码,增添了代码的描述。消除了软中断在非主函数调用时无法返回的隐患,增加了对PSR操作的流程解释及限制标志的解释。2.2.2.2.修改了应用程序执行环境初始化部分运行域生成的代码解释以及部分描述内容。改正了容易引起误解的注释,并对相关描述内容进行了修改。3.3.3.3.修改了发现的错别字。不会影响阅读及理解。欢迎各位朋友指出错误,以方便更多的朋友学习!Mini2440基础篇------启动代码的编写※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※第1页※※※※※※※※※※※※※※※※※※※※※※※※冯伟fengwei@jiangnan.edu.cnQQ:184930560Mini2440启动代码的编写启动代码是系统上电或复位以后运行的第一段代码,它的作用是在用户程序运行之前对系统硬件及软件运行环境进行必要的初始化并在最后使程序跳转到用户程序,它直接面对ARM处理器内核及硬件控制器进行编程,所执行的操作与具体的目标系统紧密相关。因为启动代码与目标系统紧密相连,所以在讲述Mini2440开发板的启动代码之前让我们先来了解一下它的启动方式。S3C2440支持两种方式的启动:NorFlash启动和NandFlash启动。NorFlash和NandFlash都是非易失性存储器,NorFlash的特点是芯片内执行,程序可以直接在其中运行,而不必将程序读取到RAM中运行。NorFlash虽然具有这个优点,但是它的性价比远低于NandFlash,因而很多系统采用NandFlash启动。NandFlash的特点是采用非线性存储模式,程序无法在其中运行,它只能作为程序或数据的存储载体,存储在其中的程序只能先拷贝到RAM中才能运行。从NorFlash启动时,与nGCS0相连的NorFlash就被映射到nGCS0片选的空间,其地址被映射为0x00000000;从NandFlash启动时,S3C2440芯片内部自带的一块容量为4K的被称为“Steppingstone”(“起步阶石”)的BootSRAM被映射到nGCS0片选的空间,其地址被映射为0x00000000。当系统上电或复位时,程序会从0地址处开始执行,因此我们编写的启动代码要确保存储在0地址处。当启动方式为NorFlash启动时,没有额外需要考虑的问题,因为这种情况下程序在系统启动前就存储在NorFlash中,我们只要保证将启动代码保存在NorFlash开始的位置即可,系统上电或复位时,0地址处的启动代码就会被执行。在启动方式为NandFlash启动的情况下,系统启动前所有的程序存储在NandFlash中,系统的启动过程稍微有点复杂:系统上电或复位时,0地址处为S3C2440内部自带的BootSRAM,启动前里面没有任何存储内容,启动后S3C2440先通过硬件机制将NandFlash前4K的内容拷贝至其中,然后再运行里面的程序(从0地址处)。这种情况下我们需要保证将启动代码保存在NandFlash开始的位置,并且启动代码的大小要小于4K。如果系统的所有程序在编译链接后的大小小于4K,那在系统的启动代码中无需考虑将程序从NandFlash搬运到SDRAM这个问题,因为所有的程序在启动时即全部由NandFlash拷贝至BootSRAM,程序在BootSRAM中运行即可;如果系统的所有程序在编译连接后的大小大于4K,那在系统的启动代码中需要包含一段将系统的全部程序从NandFlash搬运到SDRAM的代码,因为系统启动时只Mini2440基础篇------启动代码的编写※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※第2页※※※※※※※※※※※※※※※※※※※※※※※※冯伟fengwei@jiangnan.edu.cnQQ:184930560将NandFlash的前4K拷贝到了BootSRAM中,还有部分程序保存在NandFlash中,NandFlash中是无法运行程序的,需要将所有程序拷贝至SDRAM并在其中运行,所以在系统的启动代码中要包含这段有关程序拷贝的代码,并在所有程序拷贝完成后使程序跳转到SDRAM中运行。也就是说在启动方式为NandFlash启动的情况下,因为NandFlash的特性,程序需要涉及到两次的搬移,一次是从NandFlash搬移到BootSRAM,搬运的程序量大小是4K,目的是使系统能够启动;第二次搬运是从NandFlash搬运到系统的SDRAM,如果系统的所有程序量小于4K,这一步可以省略,搬运的程序量大小是系统的所有程序,目的是使程序在SDRAM中运行。第一次搬运是S3C2440通过硬件机制自动实现的,我们无需干预,第二次则需要我们程序员来实现,这部分在下面的有关内容中会详细讲解。Mini2440开发板带有两种FLASH:2M的NorFlash和128M的NandFlash。按照开发板的设计目的以及很多实际的应用,系统一般选择从NandFLASH启动,此文档讲解的内容也是基于NandFLASH启动的,但厂家为了方便大家学习还是保留了NorFlash,我们也可以将启动代码烧写至NorFlash,并从中启动。两种启动方式的启动代码稍有不同,不同点主要在上述的第二次程序拷贝。启动方式可通过拨键开关S2来选择。通过上述讲解我们简单了解了S3C2440的启动过程,现在就来讲述一下启动代码的编写过程。启动代码是面向ARM处理器内核和硬件控制器的,所以它的绝大部分都是通过汇编语言实现的。一.启动代码的功能与实现启动代码主要是在主程序运行之前初始化系统硬件及软件的运行环境,它的主要功能包括以下几个方面:■建立异常向量表■初始化系统堆栈■初始化硬件■应用程序执行环境初始化■跳转至主函数下面我们来分别讲解一下:1.1.1.1.建立异常向量表异常向量表一般位于启动代码的开始部分,它是用户程序与启动代码之间以及启动代码的各部分之间联系的纽带。它由一个一个的跳转函数组成,它就像一个普通的散转函数,只不过散转的过程中有硬件机制参与,当系统发生异常时,ARM处理器会通过硬件机制强制将PC指针指向异常向量表中Mini2440基础篇------启动代码的编写※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※第3页※※※※※※※※※※※※※※※※※※※※※※※※冯伟fengwei@jiangnan.edu.cnQQ:184930560对应的异常跳转函数存储的地址,然后程序会跳转到相应的异常中断服务程序去执行。下面我们来逐步了解一下异常向量表。ARM有7种异常,它们分别是:复位异常,当开发板上电或复位时进入;未定义指令异常,当遇到无法识别的指令时进入;软中断异常,当发生软中断时进入;预取中止异常,发生指令预取错误时进入;数据中止异常,对数据访问不能完成时进入;IRQ异常,当发生IRQ中断时进入;FIQ异常,当发生FIQ中断时进入;除了这7种异常之外,异常向量表中还有一个保留位置,所以建立异常向量表需要开辟一块大小为8×4字节的空间,每个异常占据一个字(4个字节)的空间,这一个字的空间包含的是一个跳转指令,通过这条指令使PC指向相应异常处理函数的入口,具体的异常处理函数在别处实现。异常向量表中指令、存储地址等对照表如表1所示:表1异常向量表有关的代码如下:CODE32//表明是ARM指令AREAstartup,CODE,READONLY//AREA表明段,startup是段名,CODE表明是代码段,//READONLY是性质-只读ENTRY//函数入口BResetInit//复位异常BHandlerUndef//未定义异常BHandlerSWI//软中断异常BHandlerPabort//取指中止异常BHandlerDabort//数据中止异常地址指令异常名称进入时处理器模式0x00BReset复位异常管理模式0x04BHandlerUndef未定义指令异常未定义模式0x08BHandlerSWI软中断异常管理模式0x0cBHandlerPabort指令预取异常中止模式0x10BHandlerDabort数据中止异常中止模式0x14B.保留——0x18BHandlerIRQIRQ中断异常中断模式0x1cBHandlerFIQFIQ中断异常快中断模式Mini2440基础篇------启动代码的编写※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※第4页※※※※※※※※※※※※※※※※※※※※※※※※冯伟fengwei@jiangnan.edu.cnQQ:184930560B.//保留BHandlerIRQ//中断异常BHandlerFIQ//快中断异常ARM要求异常向量表必须存储在0地址处,这样当开发板上电或复位时,PC会指向0地址处,进而跳转到复位异常处理函数函数ResetInit,这个函数负责完成系统的初始化工作,即初始化堆栈、初始化硬件、初始化应用程序执行环境、跳转至主函数;发生其他异常时ARM通过硬件机制将PC指向异常向量表对应的位置,进而跳转至相应的异常处理函数。复位异常的处理函数完成的功能我们下面会讲解(2至5大点),在此不再赘述,我们来分别看一下其他异常处理函数是怎么处理的。1.11.11.11.1未定义异常处理函数当ARM处理器不认识当前指令时,它就将该指令发送至协处理器,如果协处理器也不能识别此指令,就产生未定义异常。发生未定义异常之后,CPU会将函数的返回地址及此时的CPSR保存至未定义异常专用的R14和SPSR,然后再修改CPSR使系统进入未定义异常模式运行,PC被强制指向0x00000004,然后程序就跳转至未定义异常处理函数。上述过程都是通过硬件机制实现的,我们无需干预。如果应用中没有特殊的要求,比如用未定义异常来仿真某些器件的功能(例如浮点运算),我们可以将此处理函数编写为一个简单的死循环。程序的代码如下:HandlerUndefBHandlerUndef1.2软中断异常处理函数软件中断异常是由用户定义的中断指令,它可以用于用户模式下的程序调用特权模式下的操作指令;在实时操作系统中可以通过该机制实现系统功能调用。ARM处理器一共有7种模式,他们分别是用户模式、系统模式、管理模式、中止模式、未定义模式、中断模式和快速中断模式,七种模式之中除了用户模式以外其它六种被称为特权模式,特权模式下可以对CPSR进行修改,用户模式则只能读取CPSR的值而无法对其进行修改。在应用中一般所有任务都是在用户模式下运行的,但是用户模式下无法修改CPSR,所以无法切换到其它模式。在这种情况下我们可以通过SWI指令来解决这一问题,SWI指令可以强迫处理器从用户模式切换至管理模式,SWI是从用户模式切换到特权模式的唯一途径。处理器响应SWI异常的流程如下:发生SWI异常以后处理器自动将函数返回地址及CPSR保存至SWI模式专用的R14和SPSR,然后通过修

1 / 37
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功