ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:28.06KB ,
资源ID:26948242      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/26948242.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(ARM速成教材.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

ARM速成教材.docx

1、ARM速成教材实时操作系统(RTOS) RTOS是一段嵌入在目标代码中的程序,系统复位后首先执行 ,相当于用户的主程序,用户的其它应用程序都建立在RTOS之上。不仅如此,RTOS还是一个标准的内核,将CPU时间、中断、I/O、定时器等资源都包装起来,留给用户一个标准的API,并根据各个任务的优先级,合理地在不同任务之间分配CPU时间。 RTOS是针对不同处理器优化设计的高效率实时多任务内核,RTOS可以面对几十个系列的嵌入式处理器MPU、MCU、DSP、SOC等提供类同的API接口,这是RTOS基于设备独立的应用程序开发基础。优秀RTOS上跨处理器平台的程序移植只需要修改1-4 的内容。 在R

2、TOS基础上可以编写出各种硬件驱动 程序、专家库函数、行业库函数、产品库函数,和通用性的应用程序一起,可以作为产品销售,促进行业的知识产权交流,因此RTOS又是一个软件开发平台。 RTOS的基本结构 RTOS最关键的部分是实时多任务内核,它的基本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、旗语管理等,这些管理功能是通过内核服务函数形式交给用户调用的,也就是RTOS的 API。 ARM7启动顺序 ARM7启动过程 嵌入式系统资源有限,程序通常都固化在ROM总运行。 ROM中程序执行前,需要对系统硬件和软件运行环境进行初始化,这些工作是用汇编语言编写

3、的启动程序完成。 启动程序是嵌入式程序的开头部分,应与应用程序一起固化在ROM中,应首先在系统上运行的启动程序应包含各模块中可能出现的所有段类,并合理安排他们的次序。 Boot Loade设计Boot Loader概念 在嵌入式系统中,通常没有像PC机BIOS那样的固件程序,因此整个系统的加载启动任务就完全由Boot Loader来完成。对于我们的实验开发板,由于flash接的是微处理器Bank0的片选信号。映射的地址为0x00000000。而实验系统在上电或复位时从地址0x00000000处开始执行,所以在这个地址处安排系统的Boot Loader程序。由于Boot Loader与硬件结合非

4、常紧密,所以对于不同结构的CPU其Boot Loader程序都是不同的。Boot Loader总体设计 Stage1stage2根文件和映像文件关系如图 Boot Loader的stage1完成以下功能:(1)硬件设备初始化。(2)设置堆栈。(3)为加载Boot Loader的stage2准备RAM空间(4)拷贝Boot Loader的stage2到RAM空间中。(5)跳转到stage2的C入口点. Boot Loader的stage2必须完成以下功能:(1)初始化本阶段要使用到的硬件设备。(2)将kernel映像和根文件系统映像从flash上读到RAM空间中。(3)为内核设置启动参数。(4)

5、调用内核。 uClinux根文件及系统映象文件 对于uClinux根文件系统的制作则使用uClinux的dist包,在宿主机的Linux环境下通过make menuconfig命令来完成对根文件系统的配置,编译,连接等一系列工作,生成所需要的根文件系统映象文件。注意: 不同CPU,依赖于CPU体系结构的代码。设备初始化代码都放在stage1中,并且都用汇编语言来实现,以达到短小精悍的目的。而stage2则用C语言来实现,实现系统功能。Boot Loader实现 Boot Loader Stage1功能 术语解释 映象文件(IMAGE):指一个可以执行的文件,ELF格式. 段(section):

6、描述映象文件的代码或数据块。 RO:是Read-only的简写形式.一般存放的代码。 RW:是Read-write的简写形式。一般是存放初始化的数据。 ZI:是Zero-initialized的简写形式。一般是存放零初始化数据。 输入段(input section):它包含代码、初始化数据或描述了在应用程序运行之前必须要初始化为0的一段内存。 输出段(output section):它包含一系列具有相同R0, RW, ZI属性的输入段。 域(Regions):在一个映象文件中,一个域包含了1-3个输出段。多个域组织在一起就构成了最终的映象文件1、硬件的初始化 目的:为stage2的执行以及随后

7、的kernel的执行准备好一些基本的硬件环境 1).屏蔽所有的中断。为中断提供服务是操作系统的设备驱动程序的责任,因此在Boot Loader的执行全过程中不必响应任何中断。中断屏蔽可以通过写ARM的CPSR寄存器来完成PI。 2).设置CPU的速度和时钟频率。 3)堆栈初始化。设置堆栈指针是为执行C语言代码作准备。把sp的值设置在RAM空间距最顶端1. 5KB的地方(堆栈向上生长)。因为在不同的工作模式下所访问的堆栈指针寄存器(R13)不同,所以要初始化各种工作模式的堆栈。 4). RAM初始化。包括正确地设置系统内存控制器的功能寄存器以及各内存库控制寄存器等共有13个需要初始设置的寄存器.

8、2、为stage2准备RAM空间 S3C44BOX开实验板来说,在Bank6的片选信号上我们接了8m的SDRAM,而Bank6映射的起始地址为OXOCOOOOOO,进而RAM的空间范围为OxOcOOOOOO-OxOc7fffff3、拷贝stage2到RAM 设计了一个拷贝程序,负责将stage2的代码搬运到RAM中,让它在RAM中运行,以获得更快的速度。 在上述一切都就绪后,就可以跳转到Boot Loader的stage2去执行了。在ARM系统中,通过修改PC寄存器为合适的地址来实现。 Boot Loader Stage2的功能 stage2的代码用C语言实现,以便于实现更复杂的功能和取得更好

9、的代码可读性和可移植性。当stage1的工作完成,为stage2准备好运行环境后就可以跳转进main()函数了。直接把main ()函数的起始地址作为整个。stage2执行映像的入口点是最直接的想法。但是这样做将无法处理main()返回的情况。 为解决这个问题,可以写一段ARM的汇编程序,作为main() 函数的外部包裹。1、硬件初始化1)初始化I/0端口及两个串口,以便对终端用户输出I/0信息及与GPRS模块通信2)设定系统主频 2、内核映象文件及根文件系统的下载将uClinux的内核及根文件系统的映象文件下载到开发板上需要两个途径(1) 利用网口,使用TFTP下载;(2) 利用串口下载;(

10、在PC上的串口工具都有发送文件的功能,传输内核和根文件系统映象文件的到SDRAM)3 、加载内核映像和根文件系统映像对内存进行规划时包括两方面:(1) 内核映像所占用的内存范围,基地址和映像的大小;(2) 根文件系统所占用的内存范围,基地址和映像的大小。uClinux映象文件的执行方式:(1 )一种方式是内核映象文件直接在FLASH中运行。(2) 另一种方式是先将其解压到SDRAM中,再在SDRAM中运行。对于内核映像,因为嵌入式Linux的内核一般都不操过1MB,所以我们将其拷贝到SDRAM地址OxOc300000处。这样当开始启动uClinux时,压缩的uClinux内核将自动解压到0X0

11、c008000处开始运行。当然也可以修改为其它的地址范围,但这样做就需要对uClinux源代码包的、kefile文件进行相应的修改,操作起来非常麻烦,所以我们不对它进行改动。对根文件系统映像,我们将其拷贝到。x0c000000+0x00100000开始的地方。像ARM这样的嵌入式微处理器都是在统一的内存地址空间中寻址Flash等固态存储设备的,所以从Flash上读取数据与从RAM单元中读取数据的操作并没有什么不同。4、调用内核Boot Loader调用Linux内核的方法是直接跳转到内核的第一条指令处,对S3C44BOX来说也即直接跳转到0x0c300000地址处.当调转后uClinux就开始

12、启动。我们的Boot Loader使用mrun命令,设置启动参数,将内核映象从flash拷贝到地址0x0c300000处,并开始运行,将控制权交给操作系统,进而启动操作系统。由于mrun命令使用的函数调用及宏定义比较多,这里就不给出源代码了。完成了上述任务以后,Boot Loader设计完成ARM系统引导 启动程序一般流程如下: (1) 设置入口指针 (2) 设置中断向量 ARM7要求中断向量必须设置从0地址开始,连续8*4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令中断、数据存取错误、IRQ、FIQ和一个保留的中断向量 (如果ROM位于0地址,向量表包含一系列指令跳转到中断服务

13、程序,否则向量必须被动态初始化。可以在启动程序中添加一段代码,使其在运行时将向量表拷贝到0地址开始的存储空间) 对于各未用的中断,用一个只包含返回指令的哑函数,以防止错误引起系统的混乱。 (3) 初始化堆栈和寄存器 取决于使用了哪些中断,一般系统需要处理哪些错误类型。一般来说管理者堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈必须设置。如果系统使用了DRAM或者其他的外设,则需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息 (4) 初始化存储器系统 有些芯片可通过寄存器编程初始化存储器系统,而对于复杂系统通常集成了MMU来管理内存(5) 如果有必要改变处理器模式、状态 如果系统应用

14、程序是运行在用户模式下,可在此处将系统改为用户模式并初始化用户的堆栈指针。 (6) 初始化C语言所需要的存储器空间 为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从ROM拷贝到RAM里;一些要求快速响应的程序,如中断处理程序,也需要在RAM中运行;如果使用FLASH,对FALSH的檫除和写入也一定要在RAM里运行。ARM公司软件开发工具包中链接器提供了分布装载的功能,可实现这一目的。 (7) 呼叫C语言 ARM有两种指令集:16位的Thumb指令集和32位的指令集。使用16位的存储器可以降低成本,在这种情况下,Thumb指令集的整体执行速度要比ARM32位指令集体,而且提高了代码

15、密度,所以一般用Thumb 编译器将C语言 程序编译成16位代码。 处理器在一开始总是处于ARM状态,可使用BX指令转换到Thumb状态呼唤C语言程序,要注意的是用C语言编写的嵌入式程序时,要避免使用不能被固化到ROM的库函数。 技术难点分析- MMU的使用MMU 是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。MMU通常是CPU的一部分,本身有少量的存储空间存放从虚拟地址到物理地址的匹配表。此表称作TLB(转换旁置缓冲区)。所有数据请求都送往MMU,由MMU决定数据只在RAM中还是在大容量的存储器设备内。如果数据不在存储空间内,MMU将产生页面错误中断 MMU的两个主要功能是: 将虚拟

16、地址转换为物理地址 控制存储器存取允许。MMU关掉时,虚地址直接输出到物理地址总线。 使用MMU解决了以下几个问题:a 使用DRAM作为大容量存储器时,如果DRAM行列是非平方的,会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大的不方便,而适当的配置MMU可将其转换成虚拟地址连续的空间 b ARM内核的中断向量表放在0地址,对于ROM在0地址的情况,无法调用中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。 c 系统的某些地址是不允许被访问的,否则会产生不可预料的后果,为避免这类错误,可以通过MMU匹配表的设置将这些地址设为用户不可以存取类型; d 启动程序中生

17、成的匹配表中包含地址映射,存储页面大小(1M、64K 或者4K)以及是否允许存取等信息。 ARM系统初始化1、Bootloader引导程序Bootloader 是由汇编语言编写的芯片引导程序。它固化在目标板的ROM中,用于启动存放在RAM中或者ROM中的嵌入式软件的程序。如果CPU 支持,在bootloader 开发过程中也可以将它放在RAM中运行。在嵌入式ucLinux 的开发中,首先要根据硬件目标板的特性开发出bootloader 程序,以完成下面的任务:1. 1 初始化处理器使用bootloader 初始化处理器中的一些配置寄存器。比如:如果需要使用ARM720T 处理器的MMU 的话,

18、就应当在bootloader 中使用控制命令打开MMU。1. 2 初始化必备的硬件使用bootloader 初始化和设置板上的必备硬件。 初始化内存、FlashROM和中断控制器等 从主机下载系统映像到硬件板上的接口设备也是由它完成初始化的 有些硬件板使用以太网传输嵌入式系统映像文件,那么在bootloader 中会使用以太网卡驱动程序初始化硬件,随后与客户端的bootloader 客户端程序通讯,并完成下载工作。 2、系统初始化( Bootloader)2、1 初始化中断向量表 ARM要求中断向量表必须放置在从0 地址开始,连续8x4 字节的空间内(ARM720T和ARM9P10 及以后的A

19、RM处理器也支持从0xFFFF0000 开始的高地址向量表) 。各个中断向量表中的位置分配如下图所示: 中断向量表的程序实现通常如下所示: AREA Bootloader , CODE , READONLY ENTRY B Reset - Handler ; Reset - Handler is a lable B Undef - Handler B SWI- Handler B PreAbort - Handler B DataAbort - Handler B . ; for reserved interrupt , stop here B IRQ- Handler B FIQ- Hand

20、ler ; 其中,B 为跳转指令。2、2 初始化堆栈 因为ARM有7 种执行状态,每一种状态的堆栈指针寄存器(SP) 都是独立的(System 和User 模式使用相同的SP 寄存器) 。因此,对程序中需要用到的每一种模式都要给SP 寄存器定义一个堆栈地址。 方法是改变状态寄存器(CPSR) 内的状态位,使处理器切换到不同的状态,然后给SP 赋值。 注意不要切换到User 模式进行User 模式的堆栈设置,因为进入User 模式后就不能再操作CPSR 回到别的模式了。一般堆栈的大小要根据需要而定,但是要尽可能给堆栈分配快速和高速带宽的存储器。这对系统整体性能的提高是非常明显地。 堆栈初始化的代

21、码实例,其中只定义了两种模式的SP 指针: MRS R0 , CPSR ; CPSR = R0 BIC R0 , R0 , # MODEMASK; 安全起见,屏蔽模式位以外的其他位 ORR R1 , R0 , # IRQMODE ; 把设置模式位设置成需要的模式 MSR CPSR- cxsf , R1 ; 转到IRQ 模式 LDR SP , = UndefStack ;设置SP- irq , ORR R1 , R0 , # FRQMODE MSR CPSR- cxsf , R1 ; 转到FRQ 模式 LDR SP , = FIQStack 注意:上面用到的两个SP 是不同的物理寄存器:SP-

22、irq ,SP- fiq 。2、3 改变处理器模式 ARM处理器一共有7 种模式。除用户模式外,其他6 种都是特权模式。因为在初始化过程中,许多操作都需要在特权模式下才能进行(比如CPSR 的修改) ,所以要特别注意不能过早的进入用户模式。一般的,在初始化过程中会经历如下图所示的模式变化: 在最后阶段才能把模式转换到最终应用程序运行所需的模式,一般是用户模式。 内核级的中断使能(CPSR 的I、F状态位) 也可以考虑在这一步进行,如果系统中另外存在一个专门的中断控制器,这样做总是安全的,否则就需要考虑过早地打开中断可能带来的问题,比如在系统初始化完成之前就触发了有效中断,导致系统的死机。 3、

23、下载系统映像 系统映像是由bootloader 从主机下载到目标板的。通过bootloader 提供的命令行或者交互Shell 界面可以指定内核映像和文件系统映像的下载位置,也可以检查目标板上内存地址中的内容。在目标端的bootloader 程序中提供了接收映像的服务端程序,在主机端的程序提供了发送数据包动作(可以通过串口,也可以通过以太网卡等其他方式发送) 。发送系统映像结束之后,如果硬件允许,bootloader 还可以提供命令将下载成功的映像写入到Flash 中。一般bootloader 都提供对Flash 的驱动,支持擦写命令,为写入Flash 和检查Flash 带来了很大的便利。 通

24、过指定具体的启动地址,bootloader 也可以启动已经下载好的系统,把程序流程转入主应用程序。最简单的一种情况是: IMPORT main ; get the label main if main() is defined in other files B main ; jump to main () 4、存储器管理4. 1 存储器空间的划分 由于系统软件平台由以下部分组成:系统引导程序,嵌入式操作系统内核,文件系统 软件平台固化在Flash 中,通常根据软件平台的内容对Flash 的地址空间进行分区,一般分三个区:Bootloader,Linux 内核,文件系统。 系统引导程序(boot

25、loader) ,代码量虽少,但是作用非常大,相当于PC 上的BIOS ,负责将操作系统内核固化到Flash中和系统初始化工作,然后将系统控制权交给操作系统。 嵌入式操作系统内核是嵌入式系统加电运行后的管理平台,负责实时性任务和多任务的管理。 文件系统是嵌入式系统软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分;它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。4. 2 接口和时序的划分 一个复杂的系统可能存在多种存储类型的接口,需要根据实际的系统设计对此加以正确配置。对同一种存储器类型来说,也因为访问速度的差异,需要不同的时序配置。通常Flash 和SRAM同属于静态

26、存储器类型,可以共用同一个存储器端口; 而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。 存储器端口的接口时序是非常重要的,这会影响到整个系统的性能。因为一般系统运行的速度瓶颈都存在于存储器的访问,所以存储器访问时序应尽可能地快; 但同时又要考虑由此带来的稳定性问题,只有根据多次测试后才能确定最佳的时序配置。 4. 3 存储器地址重映射(remap) 当一个系统上电后,程序将自动从0 地址开始执行,因此在系统的初始状态,必须保证在0 地址处存在正确的代码,即要求0 地址开始处的存储器是非易性的ROM或Flash等。但是因为ROM或Flash 的访问速度相对较慢,每次中断发

27、生后,都从读取ROM 或Flash 上面的中断向量表开始,影响了中断响应速度。因此,有的系统便提供一种灵活的地址重映射方法,可以把0 地址重新指向到RAM 中去。在这种地址映射的变化过程中要注意:程序的执行流程不能被这种变化所打断。ARM系统引导bootloader1、环境设置硬件环境 ARM为内核的处理器、存储器和必要的外部接口与设备。 内嵌ARM7TDMI的Samsung公司的S3C4510处理器 存储器使用2MB的Flash和16MB的SDRAM 外部接口除了用于下载和通信的串口,还配备了一个以太网接口软件环境 系统引导程序、嵌入式操作系统内核、文件系统。 系统引导程序通常也称为boot

28、loader,代码量虽少,但是作用非常大,相当于PC上的BIOS,负责将操作系统内核固化到Flash中和系统初始化工作,然后将系统控制权交给操作系统。 嵌入式操作系统内核是嵌入式系统加电运行后的管理平台,负责实时性任务和多任务的管理。ARM7TDMI是一款没有MMU的处理器,因此采用CLinux作为本系统的操作系统内核。CLinux是Linux是一个分支,专为无MMU的处理器设计。 文件系统是嵌入式系统软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分。它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。软件分区 软件平台固化在Flash中。通常根据软件平台的内容对Flas

29、h的地址空间进行分区,一般分三个区,分别存放bootloader、CLinux内核和文件系统。 分区方式有两种: 一种是根据三个部分预定的存储空量,允许bootloader、内核和文件系统拥有自己固定的分区和首地址; 该方式,虽然可能会浪费一部分Flash空间,但是方便内核的加载和文件系统的挂载,同时也利于系统的调试和开发。 另一种就是按照这三部分的实际分配区间,一个部分紧跟着另一个部分后存储,没有固定的分区和首地址。可以充分利用Flash的存储区间,节约成本。2、系统配置系统固化 固化常见方法JTAG口;将内核和文件系统的映像文件烧写到指定的Flash位置上以太网接口;将映像文件下载到Fla

30、sh中串口;将映像文件烧写到Flash。 本系统采用采用串口烧写Flash这是因为一方面配置一个串口方便且廉价,而JTAG烧写还要配置昂贵的 JTAG仿真器和相关的驱动程序以及协议转换程序,网口下载还要有以太网支持;另一方面CLinux默认通过串口打印其运行的信息,那么串口不但可以提供烧写Flash的功能,还可作为调试CLinux内核的通道。 固化的信息内容:在本系统中,Flash在刚开始时,只存储了bootloader,存储CLinux内核,文件系统系统初始化 在本系统中,Flash在刚开始时,只存储了bootloader,还没有存储CLinux内核和文件系统。因此bootloader在系统

31、加电完成初始化工作后,要初始化一条链接主机和目标机的串口通道,并提供串口下载功能。 因为系统刚加电时,操作系统的内核还没有被加载,系统的初始化工作由bootloader完成。它主要是将系统、初始化存储系统、配置ARM各种模式下的数据栈、使能屏常中断、根据需要切换处理器模式和状态。CLinux内核运行方式 两种运行方式: 内核加载方式。一种方式是直接在Flash中运行CLinux自带的引导程序;该方式是bootloader进行系统初始化工作后,跳到内核固化在Flash中的首地址处,将控制权交给CLinux,开始在Flash中逐句执行内核自带的引导程序,由该引导程序完成内核的加载工作。 SDRAM加载方式。另一种方式是将固化在Flash中的内核先拷贝到SDRAM的某一段地址区间,再从该段地址区间的首地址运行uCLinux内核。该方式是bootloader完成系统初始化工作后,把内核的映像文件由Flash拷贝到SDRAM中,再从SDRAM中执行CLinux内核的引导程序,加载CLinux内

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1