资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,5,C H A P T E R,ARM,系统启动,本节提要,1,3,2,基于,ARM,的硬件系统体系结构,ARM,的异常,ARM,的启动过程,ARM920T,内核结构,S3C2410,的内部结构,实验平台的体系结构,2410,核心资源,总线隔离驱动,168Pin,扩展槽,网卡设备,LCD,驱动,音频电路,串口设备,USB,设备,PCMCIA,IDE/CF,卡,SD,卡接口,IO,扩展,电机等,其他资源,局部总线,扩展总线,本节提要,1,3,2,5,4,6,基于,ARM,的硬件系统体系结构,ARM,的异常,网络接口设计,I/O,接口设计,人机交互接口设计,其它通讯接口设计,异常向量,C,语言的初始化,嵌入式系统的初始化过程,嵌入式系统的初始化过程,硬件初始化阶段,1,、复位向量,ENTRY,b ResetHandler ;for debug,b HandlerUndef ;handlerUndef,b HandlerSWI ;SWI interrupt handler,b HandlerPabort;handlerPAbort,b HandlerDabort;handlerDAbort,b.;handlerReserved,b HandlerIRQ,b HandlerFIQ,嵌入式系统的初始化过程(,2,),硬件初始化阶段,2,、最小硬件初始化,1,)设置适当的寄存器,使嵌入式处理器处于一个已知的状态:,获得,CPU,的类型;,获得或设置,CPU,的时钟频率。,2,)禁止中断和高速缓存,3,)初始化内存控制器、内存芯片和高速缓存单元,包括:,得到内存的开始地址;,得到内存的大小;,如果有要求,则还需要进行主存测试;,嵌入式系统的初始化过程(,3,),硬件初始化阶段,3,、其余硬件初始化,1,)引导代码调用合适的函数对目标机系统上的全部硬件部件进行初始化,包括:,建立执行处理程序,初始化中断处理程序,初始化总线接口,初始化板级外设得到内存的开始地址;,嵌入式系统的初始化过程(,4,),RTOS,初始化阶段,4,、,RTOS,初始化,1,),RTOS,初始化,2,),RTOS,对象和服务初始化,任务,信号量,定时器,中断,内存管理,3,),RTOS,任务堆栈初始化,4,),RTOS,扩展部件初始化,5,)启动,RTOS,ARM7TDMI,系统初始化的一般过程,启动(系统上电,/,复位),从程序入口点,关闭中断,初始化时钟等硬件相关寄存器,初始化存储器系统,初始化,C,所需要的存储器空间,调用,C,入口函数,一、设置程序入口指针,上电复位后直接到程序入口点执行,入口点一般为一个跳转表,跳转到复位处理程序处开始执行,ARM7TDMI,系统的初始化;,启动程序首先必须定义,入口,指针,而且整个应用程序只有一个入口指针,例:,AREA Boot,CODE,READONLY,ENTRY /*,设置程序入口指针*,/,二、设置中断向量,ARM,要求中断向量必须设置在从,OX00000000,地址开始,连续,8*4,字节的地址空间;,向量表包含一系列跳转指令,跳转到相应的中断服务程序;,对各未用中断,使其指向一个含返回指令的哑函数,以防止错误中断引起系统的混乱;,中断向量表的程序,AREA Boot,CODE,READONLY,ENTRY,B Reset_handler,B Undef_Handler,B SWI_Handler,B PreAbort_Handler,B .;for reserved interrupt,stop here,B IRQ_handler,B FIQ_handler,三、初始化时钟和设置相关的寄存器,通过设置时钟控制器来确定,CPU,的工作频率,设置中断控制寄存器屏蔽中断,四、初始化存储器系统,存储器类型和时序配置,(,参考芯片手册,设置与内存映射相关的寄存器,),一个复杂的系统可能存在多种存储器类型的接口,需要根据实际的系统设计对此加以正确配置。对同一种存储器类型来说,也因为访问速度的差异,需要不同的时序设置。,通常,Flash,和,SRAM,同属于静态存储器类型,可以合用同一个存储器端口;,而,DRAM,因为动态刷新和地址线复用等特性,通常配有专用的存储器端口。,存储器端口的接口时序优化是非常重要的,影响到整个系统的性能。因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能地快;但同时又要考虑由此带来的稳定性问题。只有根据具体选定的芯片,进行多次的测试之后,才能确定最佳的时序配置。,存储器地址分布,有些系统具有非常灵活的存储器地址分配特性,进行存储器初始化设计的时候一定要根据应用程序的具体要求来完成地址分配。,一种典型的情况是启动,ROM,的地址重映射(,remap,)。当一个系统上电后程序将自动从,0,地址处开始执行,因此在系统的初始状态,必须保证在,0,地址处存在正确的代码,即要求,0,地址开始处的存储器是非易性的,ROM,或,Flash,等。但是因为,ROM,或,Flash,的访问速度相对较慢,每次中断发生后都要从读取,ROM,或,Flash,上面的向量表开始,影响了中断响应速度。因此有的系统便提供一种灵活的地址重映射方法,可以把,0,地址重新指向到,RAM,中去。在这种地址映射的变化过程当中,程序员需要仔细考虑的是程序的执行流程不能被这种变化所打断。,ROM,地址的重映射,(remap),0 x0200,(,boot code),0 x0100,(Reset_handler),B Reset_Handler,0 x0000,Flash,(remap),0 x0204,(,boot code),0 x0200,(Reset_handler),B Reset_Handler,0 x0000,RAM,ROM,地址重映射的实现,mov r8,#RAM_BASE_BOOT/RAM_BASE_BOOT,是重映射前内部,RAM,区地址,add r9,pc,#-(8+.-VectorTable)/VectorTale,是异常向量表入口,ldmia r9!,r0-r7 /,读,8,个异常向量,stmia r8!,r0-r7 /,保存,8,个异常向量到,RAM,区,ldmia r9!,r0-r4 /,读,5,个异常处理程序绝对地址,stmia r8!,r0-r4 /,保存,5,个异常处理程序绝对地址到,RAM,区,为保证重映射之后提供正确的中断入口地址,在重映射之前就必须把中断和异常向量表拷贝到内部,RAM,中。其程序实现如下:,五、初始化堆栈,ARM,处理器有好几种运行状态(模式),各种状态都需要有自己的堆栈,所以需要分别为这些堆栈分配空间并设置好各自的堆栈指针,每一种状态的堆栈指针寄存器(,SP,)都是独立的(,System,和,User,模式使用相同的,SP,寄存器)。因此对程序中需要用到的每一种模式都要给,SP,寄存器定义一个堆栈地址。方法是改变状态寄存器,CPSR,内的状态位,使处理器切换到不同的状态,然后给,SP,赋值。(注意:不要切换到,User,模式进行,User,模式的堆栈设置,因为进入,User,模式后就不能再操作,CPSR,回到别的模式了。可能会对接下去的程序执行造成影响。),一般堆栈的大小要根据需要而定,但是要尽可能给堆栈分配快速和高带宽的存储器。堆栈性能的提高对系统整体性能的影响是非常明显的。,堆栈初始化代码示例,MRS R0,CPSR ;CPSR-R0,BIC R0,R0,#MODEMASK ;,安全起见,屏蔽模式位以外的其它位,ORR R1,R0,#IRQMODE ;,把设置模式位设置成需要的模式(,IRQ,),MSR CPSR_cxsf,R1 ;,转到,IRQ,模式,LDR SP,=UndefStack ;,设置,SP_irq,ORR R1,R0,#FIQMODE,MSR CPSR_cxsf,R1 ;FIQMode,LDR SP,=FIQStack,ORR R1,R0,#SVCMODE,MSR CPSR_cxsf,R1 ;SVCMode,LDR SP,=SVCStack,六、初始化应用程序执行环境,映像一开始总是存储在,ROM/Flash,里面的,其,RO,部分既可以在,ROM/Flash,里面执行,也可以转移到速度更快的,RAM,中去;而,RW,和,ZI,这两部分必须是需要转移到可写的,RAM,里去的。所谓应用程序执行环境的初始化,就是完成必要的从,ROM,到,RAM,的数据传输和内容清零。,六、初始化,C,环境,在目标文件中,代码、数据放在不同的段中。源文件编译链接生成含,.data,、,.text,段的目标文件,且链接器生成的,.data,段是以系统,RAM,为参考地址,故在系统启动时需要拷贝,ROM,或,FLASH,中的,.data,段到,RAM,,以完成对,RAM,的初始化。在初始化期间应将系统需要读写的数据和变量从,ROM,拷贝到,RAM,里运行,链接器产生的符号表,符号由链接器自动产生,只读段(,read-only RO,)就是代码段,读写段(,read-write RW,)是已经初始化的全局变量,而零初始化段(,zero-initialized section ZI,)中存放未初始化的全局变量;,初始化,C,环境(,2,),C,环境初始化,就是利用上述符号初始化,RW,和,ZI,段以使后面使用的全局变量的,C,程序正常运行;,这里有两个循环,第一个循环把预初始化的数据段,RW,(位于代码段的后面)复制到,RAM,中,另一个循环把未初始化的数据段,ZI,初始化为,0,,也就是实现把从,ROM,中的,.data,段拷贝到,RAM,,对,ZI,段内的数据初始化为,0,,以完成对,C,环境的实始化;,初始化,C,环境(,3,),改变处理器模式,除用户模式以外,其他,6,种模式都是特权模式。因为在初始化过程中许多操作需要在特权模式下才能进行(比如,CPSR,的修改),所以要特别注意不能过早地进入用户模式。一般地,在初始化过程中会经历以下一些模式变化:,七、调用,C,程序,对,main,函数的调用进入,uc/OS,的入口,通过这个入口就进入,uC/OS,的主函数,启动对,uC/OS,的初始化,例,IMPORT Main,b Main ;C Entry,uC/OS,系统的初始化,完成了前面的硬件初始化和运行环境的相关设置后,进入,Main(),,,Main(),是,uC/OS,的入口函数,启动对,uC/OS,的初始化,ARM,的硬件抽象层,uHALuC/OS,ARM,公司为操作系统的开发提供了一个硬件抽象层,HAL,,称为,uHAL,;,从结构上看,,uHAL,是一组库程序,需要说明的是,,uHAL,并不是专门为,uC/OS,准备的,甚至也不是专为操作系统内核准备的;,uHAL,只是个针对,ARM,核的函数库;,uC/OS,是建立在,uHAL,的基础之上的;,uHAL,的功能,uHAL,的作用之一是在操作系统本身进入正常运行之前,为系统提供基本的输入输出手段,例如,uHALr_printf(),等;,uHAL,还要为操作系统的运行准备一个基本的运行环境,具体包括下列各种初始化:,通过,uHAL_ResetMMU(),,将,MMU,设置在一个确定的初始状态;,通过,ARMDisable(),关闭中断;,通过,uHAL_InitInterrupts(),设置中断向量处理程序;,通过,uHAL_InitTimer(),对系统使用的计数器进行初始化,uC/OS,系统的初始化(,2,),ARMTargetInit(),函数结构,ARMTargetInit(),调,uHAL,打印接口打印系统信息,调用,uHAL,函数禁止所有中断,调用,uHAL,函数对中断初始化,uHAL,函数对,ARM,计数器初始化,结束,ARMTargetStart(),的分析,创建了任务之后,,ARMTargetStart(),调用,uHALr_InstallSystemTimer(),创建一个系统时钟,为时钟中断做好准备;,
展开阅读全文