《ARM速成教材.docx》由会员分享,可在线阅读,更多相关《ARM速成教材.docx(9页珍藏版)》请在优知文库上搜索。
1、实时操作系统(RToS) RTaS是一段嵌入在目标代码中的程序,系统更位后首先执行,相当于用户的主程序JH户的其它应用程序都建立在RToS之上。不仅如此,RTOS还是一个标准的内核,将CPU时间、中断、I/O、定时器等资源都包装起来.留给用户一个标准的API,并根据各个任务的优先级,合理地在不同任务之间分配CpV时间. RTOS是针对不同处埋器优化设计的高效率实时多任务内核.RTOS可以面对几十个系列的嵌入式处理器MP1.MCU、DSP,SOC等提供类同的AP1.接口,这是RTOS法于设备独立的应用程序开发基础,优秀RTaS上跨处理器平台的程序移抗只需要修改14的内容. 在RTOS基础上可以阑
2、写出各种使件驱动程序、专室库函数.行业库函数、产品库函数,和通用性的应用程序一起,可以作为产都销售,促进行业的知识产权交流,因此RTOS又是一个软件开发平台. RTaS的根本站构RToS呆关键的局部是实时多任务内核,它的根本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理系统管理、消息管理、队列管理、旗谱管理等.这些管理功能是通过内核效劳函数形式交给用户周用的,也就是RTOS的AP1.ARM7启动顺序 ARN7启动过程 嵌入式系统资源有限,程序通常掷固化在KOM总运行. ROM中程序执行前,需要对系统硬件和软件运行环境进行初始化,这些工作是用汇编语言编写的启动程序完成。 启动程序是
3、嵌入式程序的开头局部.应与陶用程序一起同化在RoM中,应苜先在系统上运行的后动程序应包含各模块中可能出现的所行段类,JF合理安排他们的次序.Bt1.oade设计Boot1.oader概念在嵌入式系统中,通常没有像PC机B1.oS那样的固件程序,因此整个系蛟的加我后动任务就完全由BOot1.Oader来完成。对于我们的实验开发板,由于f1.ash接的是微处理盘BankO的片选信号.映射的地址为0x00000000,而实验系统在上电或发位时从地址OXc100OOOoO处开始执行,所以在这个地址处安排系统的Boot1.oader程序由于Boot1.oader与硬件结合非常紧密,所以对于不同结构的CP
4、U其Boot1.oader程序都是不同的.Boot1.Oader总体设计SIiIKeIs1.ac2根文件和映像文件关系如图BoOt1.oader的StageI完成以下功能:(D随件设备初始化(2)设两堆栈.(3)为加载Bout1.oadei-的stage2准径RAM空间拷贝Boot1.oader的Stage2到RAM空间中.跳传到Stage2的C入口点. Boot1.oader的Stage2必须完成以下功能:(1)初始化本阶段要使用到的帔件设符。(2)招kerne1.映像和根文件系统映像从f1.ash上读到RAM空间中.(3)为内核设置启动参数.调用内核。 UC1.inUK根文件及系统映象文件
5、对于UCIinUX根文件系统的制作则使用uC1.inux的dist包.在宿主机的1.inux环境下通过makeBenUCOnfig命令来完成对极文件系统的也捏,编洋,连接等一系列J1.作,生成所需要的极文件系统映象文件.注意:不同(TU,依赖FCPU体系结构的代码,设备初始化代码都放在SIageI中,并且都用汇编语言来实现,以到达短小精悍的目的。而SIage2,用C语言来实现,实现系统功能。BoOt1.oader实现Boot1.oaderStage1.功能 术语解择 映象文件(IMAGE):指一个可以执行的文件,E1.F格式. 段(section):描述映象文件的代码或数据块. RO:Read
6、-on1.y的简写形式.一般存放的代码. RW:是Read-WriIe的简写形式。一般是存放初始化的数据. ZI:是Zero-iniIia1.ized的简写形式,一般是存放零初始化数据, 帖入段(inputSeetion):它包含代码.初始化数据或描述了在应用程序运行之前必须要初始化为0的一段内存, 输出段(O1.HPU1.SeCIiOn):它包含一系列具有相I可RO,RW1ZI属性的输入段, 域(Refcions):在一个映象文件中,一个域包含了13个输出段。多个域组织在-起就构成了最终的映象文件1、硬件的初始化,日的:为Stage2的执行以及随后的kerne1.的执行准备好一些根本的现件环
7、境 1).屏蔽所有的中断。为中断提供效劳是操作系统的设备咏动程序的贵仔,因此在Boot1.oader的执行全过程中不必响应任何中断.中断屏蔽可以通过写ARM的CPSR存放湍未完成PI. 2).设比CPtJ的速度和时钟频率得 3堆校初始化。设置堆栈指针是为执行C语言代码作准法,把SD的值设冏在RAM空间距最顶蜡1.5KB的地方(堆栈向上生长)。因为在不同的工作模式卜所访问的堆栈指针存放器(R13)不同,所以要初始化各种工作模式的堆栈. 4).IMM初始化,包括正确地设置系统内存控制器的功能存放器以及各内存阵控制存放器等共有13个需要初始设湿的存放涔.2、为S1.aKC2准符RAM空间 SSC1.
8、tBOX开实5金板来说,在Bnnk6的片选信号上我们接了8m的SDRAM,而Bank6映射的起始地址为OXOC(XX)(X)O.进而KAH的空间范围为OXOCoooO(XHhCoC7fffff3、拷贝SIage2到RAM 设计了一个拷贝程序,负或将s1.ac2的代码救运到RAY中,让它在RAM中运行,以获得更快的速度。 在上述一切都就绪后.就可以跳转到BOOt1.Oader的Stage2去执行了.在ARM系统中,通过修改PC存放器为适宜的地址来实现.Boot1.oaderSIage2的功能stage2的代码用C语言实现,以便于实现更IX杂的功能和取得更好的代码可读性和可移抗性。当stage)的
9、工作完成,为Stage2准备好运行环境后就可以跳转进main。的数j直接把main。函数的起始地址作为整个.Stage2执行映像的入口点是最直接的想法.但是这样做将无法处埋Inaino返回的情况。为解决这个问即,可以写一段RRM的汇铝程序,作为Inaino函数的外部包衣】、硬件初始化1)初始化0端口及两个电11,以便时终端用户输出I/O信息及与GPRS模块通信2)设定系统主频2、内核映象文件及根文件系统的下载将UC1.inux的内核及根文件系统的映象文件下载到开发板上缁要两个途径(1)利用网口,使用TFTP下教:(2)利用串口下做;(在PC上的串口工具都有发送文件的功能.传输内核和根文件系统映
10、象文件的到SDRAM)3、加载内核映像和根文件系统映像对内存进行规划时包括两方面:(1)内核映像所占用的内存范围.基地址和映像的大小:(2)根文件系统所占用的内存范围,基地址和映像的大小.UCIinUX映软文件的执行方式:(1)一种方式是内核映象文件直接在F1.ASH中运行。(2)另一种方式是先招其解压到Si)RAM中.再在SDRAM中运行.对于内核映像,因为嵌入式1.inux的内核一般都不操过1MB.所以我们将其拷贝到SI)RM地址OXoC300000处。这样当开始启动UCIinUX时,压缩的UCIinUX内核将自动解压到OXOCoo8000处开始运行,当然也可以修改为其它的地址范树,但这样
11、憾就需要对UainUX源代码包的、kefiIe文件进行相应的修改,操作起来非常麻烦.所以我们不对它进行改动.对根文件系统映像.我们构具拷贝到.XOCOOCoOO+0x00100000开始的地方.像ARN这样的嵌入式微处理器都是在统一的内存地址空间中寻址F1.ash等固态存储设备的,所以从F1.ash上读取数据与从RAM单元中读取数据的操作并没有什么不同.4、调用内核Boot1.oader调用1.inux内核的方法是直接跳转到内核的第一条指令处,对S3C44HOX来说也即直接跳转到OXOC300000地址处.当调转后uC1.inux就开始启动.我们的Boot1.oader使用mrun命令,设置启
12、动参数,将内核映象从门ash拷贝到地址0x(k300000处,井开始运行,将控制权交给操作系统,进而启动操作系统.由于InrUn命令使用的函数调用及宏定义比较多,这里就不给出源代码了.完成了上述任务以后,BOOt1.oader设计完成ARM系统引导启动程序一般流程如下:1)设置入门指针2)设范中断向最ARN7要求中断向量必须设置从0地址开始,连续8*,1字节的空间,分别是复位、未定义指令楷谈、软件中断、读收指令中断、数据存取怫误、IRQ、FIQ和一个保存的中断向量(如果ROM位于0地址,向量表包含一系列指令跳转到中断效劳程序,否则向显必须被动态初始化.可以在扇动程序中添加一段代码,使其在运行时
13、拘向此表拷贝到。地址开始的存储空间)对于各未用的中断,用一个只包含返回指令的哑函数,以防止错误引起系统的混乱。(3)初始化堆栈和存放取决于使用了哪些中断,一般系统湎要处理哪些错误类型.一般来说管理者堆栈必须设置.如果使用了IRQ中断,则IRQ堆栈必须设置,如果系统使用了DRAM或者其他的外设,则需要设置相关的存放器,以确定其刷新频率,数据总线宽度等信息(4)初始化存储零系统有些芯片可通过存放器编程初始化存储涔系统,而对于狂杂系统通常佻成了UM1.来管埋内存(5)如果有必要设变处理器模式、状态如果系统应用程序是运行在用户模式下,可在此处将系统改为用户模式并初始化用户的堆栈指针,(6)初始化C谱言
14、所需要的存储器空间为正确运行应用程序,在初始化期间应将系统需要读写的数据和变盘从ROM拷贝到HAM里:一些要求快速响应的程序,如中断处理程序,也需要在RAM中运行:如果使用F1.ASH,时FA1.SH的燃除和写入也一定要在RA1里运行。ARM公司软件开发工具包中链接器提供了分布装我的功能,可实现这一目的。(7)呼叫C语*A1.W。两种指令集:16位的ThUmb指令集和32位的指令集.使用16位的存储器可以降低本钱,在这种情况下,ThUmb指令集的整体执行速度要比ARM32位指令集体,而且提高了代码密度,所以一般用IhUmb编译湍将C追古程序编年成16位代码.处理器在一开始总是处于ARM状态,可
15、使用BX指令转换到Thumb状态呼唤C语言程序,要注意的是用C语言编写的战入式程序时,要防止使用不能被固化到ROM的库函数,技术难点分析MM1.的使用MM1.,是存储器管埋单元的缩写,是用来管理虚拟内存系统的器件.YM1.通常是Cp(J的一局部,本身有少信的存储空间存放从虚拟地址到物理胞址的匹配衣。此表称作T1.B(转换旁附缓冲区)。所有数据请求都送往理心由MMI:决定数据只在RAV中还是在大容价的存储器设备内。如果数据不在存储空间内,MMV将产生页面错误中断MM1.的两个主要功旎是:将虚拟地址转换为物理地址控制存谛器存取允许。划(J关抻时,虚地址宜接输出到物理地址总践。使用MMU解决了以下几个问电:a.使川DRAY作为大容量存储器时,如果DRAY行列是非平方的,会导致该DRAY的物理地址不连续,这将给程序的编写网试造成极大的不方便,而适当的配置可将其转换成虚拟惚址连续的空间b.ARM内核的中断向献去放在0他址,对于Rm1.在0地址的情况,无法调用中断效劳程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。c.系统的某些地址是不允许被访问的否则会产生不可鼓料的后果,为防止这类错i可以通过M虬匹配表的设置将这些地址设为用户不可以存取类型:1