ARM速成教材.docx

上传人:b****3 文档编号:26948242 上传时间:2023-06-24 格式:DOCX 页数:18 大小:28.06KB
下载 相关 举报
ARM速成教材.docx_第1页
第1页 / 共18页
ARM速成教材.docx_第2页
第2页 / 共18页
ARM速成教材.docx_第3页
第3页 / 共18页
ARM速成教材.docx_第4页
第4页 / 共18页
ARM速成教材.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

ARM速成教材.docx

《ARM速成教材.docx》由会员分享,可在线阅读,更多相关《ARM速成教材.docx(18页珍藏版)》请在冰豆网上搜索。

ARM速成教材.docx

ARM速成教材

实时操作系统(RTOS)

⏹RTOS是一段嵌入在目标代码中的程序,系统复位后首先执行,相当于用户的主程序,用户的其它应用程序都建立在RTOS之上。

不仅如此,RTOS还是一个标准的内核,将CPU时间、中断、I/O、定时器等资源都包装起来,留给用户一个标准的API,并根据各个任务的优先级,合理地在不同任务之间分配CPU时间。

⏹RTOS是针对不同处理器优化设计的高效率实时多任务内核,RTOS可以面对几十个系列的嵌入式处理器MPU、MCU、DSP、SOC等提供类同的API接口,这是RTOS基于设备独立的应用程序开发基础。

优秀RTOS上跨处理器平台的程序移植只需要修改1-4的内容。

⏹在RTOS基础上可以编写出各种硬件驱动程序、专家库函数、行业库函数、产品库函数,和通用性的应用程序一起,可以作为产品销售,促进行业的知识产权交流,因此RTOS又是一个软件开发平台。

⏹RTOS的基本结构

RTOS最关键的部分是实时多任务内核,它的基本功能包括任务管理、定时器管理、存储器管理、资源管理、事件管理、系统管理、消息管理、队列管理、旗语管理等,这些管理功能是通过内核服务函数形式交给用户调用的,也就是RTOS的API。

ARM7启动顺序

⏹ARM7启动过程

⏹嵌入式系统资源有限,程序通常都固化在ROM总运行。

⏹ROM中程序执行前,需要对系统硬件和软件运行环境进行初始化,这些工作是用汇编语言编写的启动程序完成。

⏹启动程序是嵌入式程序的开头部分,应与应用程序一起固化在ROM中,应首先在系统上运行的启动程序应包含各模块中可能出现的所有段类,并合理安排他们的次序。

BootLoade设计

BootLoader概念

⏹在嵌入式系统中,通常没有像PC机BIOS那样的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。

对于我们的实验开发板,由于flash接的是微处理器Bank0的片选信号。

映射的地址为0x00000000。

而实验系统在上电或复位时从地址0x00000000处开始执行,所以在这个地址处安排系统的BootLoader程序。

由于BootLoader与硬件结合非常紧密,所以对于不同结构的CPU其BootLoader程序都是不同的。

BootLoader总体设计

⏹Stage1\stage2\根文件和映像文件关系如图

⏹BootLoader的stage1完成以下功能:

(1)硬件设备初始化。

(2)设置堆栈。

(3)为加载BootLoader的stage2准备RAM空间

(4)拷贝BootLoader的stage2到RAM空间中。

(5)跳转到stage2的C入口点.

⏹BootLoader的stage2必须完成以下功能:

(1)初始化本阶段要使用到的硬件设备。

(2)将kernel映像和根文件系统映像从flash上读到RAM空间中。

(3)为内核设置启动参数。

(4)调用内核。

⏹uClinux根文件及系统映象文件

⏹对于uClinux根文件系统的制作则使用uClinux的dist包,在宿主机的Linux环境下通过makemenuconfig命令来完成对根文件系统的配置,编译,连接等一系列工作,生成所需要的根文件系统映象文件。

注意:

⏹不同CPU,依赖于CPU体系结构的代码。

设备初始化代码都放在stage1中,并且都用汇编语言来实现,以达到短小精悍的目的。

而stage2则用C语言来实现,实现系统功能。

BootLoader实现

⏹BootLoaderStage1功能

⏹术语解释

⏹映象文件(IMAGE):

指一个可以执行的文件,ELF格式.

⏹段(section):

描述映象文件的代码或数据块。

⏹RO:

是Read-only的简写形式.一般存放的代码。

⏹RW:

是Read-write的简写形式。

一般是存放初始化的数据。

⏹ZI:

是Zero-initialized的简写形式。

一般是存放零初始化数据。

⏹输入段(inputsection):

它包含代码、初始化数据或描述了在应用程序运行之前必须要初始化为0的一段内存。

⏹输出段(outputsection):

它包含一系列具有相同R0,RW,ZI属性的输入段。

⏹域(Regions):

在一个映象文件中,一个域包含了1-3个输出段。

多个域组织在一起就构成了最终的映象文件

1、硬件的初始化

⏹目的:

为stage2的执行以及随后的kernel的执行准备好一些基本的硬件环境

⏹1).屏蔽所有的中断。

为中断提供服务是操作系统的设备驱动程序的责任,因此在BootLoader的执行全过程中不必响应任何中断。

中断屏蔽可以通过写ARM的CPSR寄存器来完成PI。

⏹2).设置CPU的速度和时钟频率。

⏹3)堆栈初始化。

设置堆栈指针是为执行C语言代码作准备。

把sp的值设置在RAM空间距最顶端1.5KB的地方(堆栈向上生长)。

因为在不同的工作模式下所访问的堆栈指针寄存器(R13)不同,所以要初始化各种工作模式的堆栈。

⏹4).RAM初始化。

包括正确地设置系统内存控制器的功能寄存器以及各内存库控制寄存器等共有13个需要初始设置的寄存器.

2、为stage2准备RAM空间

⏹S3C44BOX开实验板来说,在Bank6的片选信号上我们接了8m的SDRAM,而Bank6映射的起始地址为OXOCOOOOOO,进而RAM的空间范围为OxOcOOOOOO-OxOc7fffff

3、拷贝stage2到RAM

⏹设计了一个拷贝程序,负责将stage2的代码搬运到RAM中,让它在RAM中运行,以获得更快的速度。

⏹在上述一切都就绪后,就可以跳转到BootLoader的stage2去执行了。

在ARM系统中,通过修改PC寄存器为合适的地址来实现。

⏹BootLoaderStage2的功能

⏹stage2的代码用C语言实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性。

当stage1的工作完成,为stage2准备好运行环境后就可以跳转进main()函数了。

直接把main()函数的起始地址作为整个。

stage2执行映像的入口点是最直接的想法。

但是这样做将无法处理main()返回的情况。

⏹为解决这个问题,可以写一段ARM的汇编程序,作为main()函数的外部包裹。

1、硬件初始化

1)初始化I/0端口及两个串口,以便对终端用户输出I/0信息及与GPRS模块通信

2)设定系统主频

2、内核映象文件及根文件系统的下载

将uClinux的内核及根文件系统的映象文件下载到开发板上需要两个途径

(1)利用网口,使用TFTP下载;

(2)利用串口下载;(在PC上的串口工具都有发送文件的功能,传输内核和根文件系统映象文件的到SDRAM)

3、加载内核映像和根文件系统映像

对内存进行规划时包括两方面:

(1)内核映像所占用的内存范围,基地址和映像的大小;

(2)根文件系统所占用的内存范围,基地址和映像的大小。

uClinux映象文件的执行方式:

(1)一种方式是内核映象文件直接在FLASH中运行。

(2)另一种方式是先将其解压到SDRAM中,再在SDRAM中运行。

对于内核映像,因为嵌入式Linux的内核一般都不操过1MB,所以我们将其拷贝到SDRAM地址OxOc300000处。

这样当开始启动uClinux时,压缩的uClinux内核将自动解压到0X0c008000处开始运行。

当然也可以修改为其它的地址范围,但这样做就需要对uClinux源代码包的、kefile文件进行相应的修改,操作起来非常麻烦,所以我们不对它进行改动。

对根文件系统映像,我们将其拷贝到。

x0c000000+0x00100000开始的地方。

像ARM这样的嵌入式微处理器都是在统一的内存地址空间中寻址Flash等固态存储设备的,所以从Flash上读取数据与从RAM单元中读取数据的操作并没有什么不同。

4、调用内核

BootLoader调用Linux内核的方法是直接跳转到内核的第一条指令处,对S3C44BOX来说也即直接跳转到0x0c300000地址处.当调转后uClinux就开始启动。

我们的BootLoader使用mrun命令,设置启动参数,将内核映象从flash拷贝到地址0x0c300000处,并开始运行,将控制权交给操作系统,进而启动操作系统。

由于mrun命令使用的函数调用及宏定义比较多,这里就不给出源代码了。

完成了上述任务以后,BootLoader设计完成

ARM系统引导

⏹启动程序一般流程如下:

(1)设置入口指针

(2)设置中断向量

ARM7要求中断向量必须设置从0地址开始,连续8*4字节的空间,分别是复位、未定义指令错误、软件中断、预取指令中断、数据存取错误、IRQ、FIQ和一个保留的中断向量(如果ROM位于0地址,向量表包含一系列指令跳转到中断服务程序,否则向量必须被动态初始化。

可以在启动程序中添加一段代码,使其在运行时将向量表拷贝到0地址开始的存储空间)对于各未用的中断,用一个只包含返回指令的哑函数,以防止错误引起系统的混乱。

(3)初始化堆栈和寄存器

取决于使用了哪些中断,一般系统需要处理哪些错误类型。

一般来说管理者堆栈必须设置,如果使用了IRQ中断,则IRQ堆栈必须设置。

如果系统使用了DRAM或者其他的外设,则需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息

(4)初始化存储器系统

有些芯片可通过寄存器编程初始化存储器系统,而对于复杂系统通常集成了MMU来管理内存  

(5)如果有必要改变处理器模式、状态

  如果系统应用程序是运行在用户模式下,可在此处将系统改为用户模式并初始化用户的堆栈指针。

(6)初始化C语言所需要的存储器空间

  为正确运行应用程序,在初始化期间应将系统需要读写的数据和变量从ROM拷贝到RAM里;一些要求快速响应的程序,如中断处理程序,也需要在RAM中运行;如果使用FLASH,对FALSH的檫除和写入也一定要在RAM里运行。

ARM公司软件开发工具包中链接器提供了分布装载的功能,可实现这一目的。

(7)呼叫C语言

  ARM有两种指令集:

16位的Thumb指令集和32位的指令集。

使用16位的存储器可以降低成本,在这种情况下,Thumb指令集的整体执行速度要比ARM32位指令集体,而且提高了代码密度,所以一般用Thumb编译器将C语言程序编译成16位代码。

  处理器在一开始总是处于ARM状态,可使用BX指令转换到Thumb状态呼唤C语言程序,要注意的是用C语言编写的嵌入式程序时,要避免使用不能被固化到ROM的库函数。

⏹技术难点分析----MMU的使用

  MMU是存储器管理单元的缩写,是用来管理虚拟内存系统的器件。

MMU通常是CPU的一部分,本身有少量的存储空间存放从虚拟地址到物理地址的匹配表。

此表称作TLB(转换旁置缓冲区)。

所有数据请求都送往MMU,由MMU决定数据只在RAM中还是在大容量的存储器设备内。

如果数据不在存储空间内,MMU将产生页面错误中断

⏹MMU的两个主要功能是:

⏹将虚拟地址转换为物理地址

⏹控制存储器存取允许。

MMU关掉时,虚地址直接输出到物理地址总线。

⏹使用MMU解决了以下几个问题:

a.使用DRAM作为大容量存储器时,如果DRAM行列是非平方的,会导致该DRAM的物理地址不连续,这将给程序的编写调试造成极大的不方便,而适当的配置MMU可将其转换成虚拟地址连续的空间

b.ARM内核的中断向量表放在0地址,对于ROM在0地址的情况,无法调用中断服务程序,所以在调试阶段有必要将可读写的存储器空间映射到0地址。

c.系统的某些地址是不允许被访问的,否则会产生不可预料的后果,为避免这类错误,可以通过MMU匹配表的设置将这些地址设为用户不可以存取类型;

d.启动程序中生成的匹配表中包含地址映射,存储页面大小(1M、64K或者4K)以及是否允许存取等信息。

ARM系统初始化

1、Bootloader引导程序

Bootloader是由汇编语言编写的芯片引导程序。

它固化在目标板的ROM中,用于启动存放在RAM中或者ROM中的嵌入式软件的程序。

如果CPU支持,在bootloader开发过程中也可以将它放在RAM中运行。

在嵌入式ucLinux的开发中,首先要根据硬件目标板的特性开发出bootloader程序,以完成下面的任务:

1.1 初始化处理器

使用bootloader初始化处理器中的一些配置寄存器。

比如:

如果需要使用ARM720T处理器的MMU的话,就应当在bootloader中使用控制命令打开MMU。

1.2 初始化必备的硬件

使用bootloader初始化和设置板上的必备硬件。

⏹初始化内存、FlashROM和中断控制器等

⏹从主机下载系统映像到硬件板上的接口设备也是由它完成初始化的

⏹有些硬件板使用以太网传输嵌入式系统映像文件,那么在bootloader中会使用以太网卡驱动程序初始化硬件,随后与客户端的bootloader客户端程序通讯,并完成下载工作。

2、系统初始化(Bootloader)

2、1 初始化中断向量表

⏹ARM要求中断向量表必须放置在从0地址开始,连续8x4字节的空间内(ARM720T和ARM9P10及以后的ARM处理器也支持从0xFFFF0000开始的高地址向量表)。

各个中断向量表中的位置分配如下图所示:

⏹中断向量表的程序实现通常如下所示:

⏹AREABootloader,CODE,READONLY

⏹ENTRY

⏹BReset-Handler;Reset-Handlerisalable

⏹BUndef-Handler

⏹BSWI-Handler

⏹BPreAbort-Handler

⏹BDataAbort-Handler

⏹B .  ; forreservedinterrupt,stophere

⏹BIRQ-Handler

⏹BFIQ-Handler ;  其中,B为跳转指令。

2、2 初始化堆栈

⏹因为ARM有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的(System和User模式使用相同的SP寄存器)。

因此,对程序中需要用到的每一种模式都要给SP寄存器定义一个堆栈地址。

⏹方法是改变状态寄存器(CPSR)内的状态位,使处理器切换到不同的状态,然后给SP赋值。

⏹注意不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了。

一般堆栈的大小要根据需要而定,但是要尽可能给堆栈分配快速和高速带宽的存储器。

这对系统整体性能的提高是非常明显地。

⏹堆栈初始化的代码实例,其中只定义了两种模式的SP指针:

⏹MRSR0,CPSR;CPSR=>R0

⏹BICR0,R0,#MODEMASK;安全起见,屏蔽模式位以外的其他位

⏹ORRR1,R0,#IRQMODE;把设置模式位设置成需要的模式

⏹MSRCPSR-cxsf,R1;转到IRQ模式

⏹LDRSP,=UndefStack;设置SP-irq,

⏹ORRR1,R0,#FRQMODE

⏹MSRCPSR-cxsf,R1;转到FRQ模式

⏹LDRSP,=FIQStack

⏹注意:

上面用到的两个SP是不同的物理寄存器:

SP-irq,SP-fiq。

2、3改变处理器模式

⏹ARM处理器一共有7种模式。

除用户模式外,其他6种都是特权模式。

因为在初始化过程中,许多操作都需要在特权模式下才能进行(比如CPSR的修改),所以要特别注意不能过早的进入用户模式。

一般的,在初始化过程中会经历如下图所示的模式变化:

⏹在最后阶段才能把模式转换到最终应用程序运行所需的模式,一般是用户模式。

⏹内核级的中断使能(CPSR的I、F状态位)也可以考虑在这一步进行,如果系统中另外存在一个专门的中断控制器,这样做总是安全的,否则就需要考虑过早地打开中断可能带来的问题,比如在系统初始化完成之前就触发了有效中断,导致系统的死机。

3、下载系统映像

⏹系统映像是由bootloader从主机下载到目标板的。

通过bootloader提供的命令行或者交互Shell界面可以指定内核映像和文件系统映像的下载位置,也可以检查目标板上内存地址中的内容。

在目标端的bootloader程序中提供了接收映像的服务端程序,在主机端的程序提供了发送数据包动作(可以通过串口,也可以通过以太网卡等其他方式发送)。

发送系统映像结束之后,如果硬件允许,bootloader还可以提供命令将下载成功的映像写入到Flash中。

一般bootloader都提供对Flash的驱动,支持擦写命令,为写入Flash和检查Flash带来了很大的便利。

⏹通过指定具体的启动地址,bootloader也可以启动已经下载好的系统,把程序流程转入主应用程序。

最简单的一种情况是:

⏹IMPORTmain;getthelabelmainifmain()isdefinedinotherfiles

⏹Bmain;jumptomain()

4、存储器管理

4.1 存储器空间的划分

⏹由于系统软件平台由以下部分组成:

系统引导程序,嵌入式操作系统内核,文件系统

⏹软件平台固化在Flash中,通常根据软件平台的内容对Flash的地址空间进行分区,一般分三个区:

Bootloader,Linux内核,文件系统。

⏹系统引导程序(bootloader),代码量虽少,但是作用非常大,相当于PC上的BIOS,负责将操作系统内核固化到Flash中和系统初始化工作,然后将系统控制权交给操作系统。

⏹嵌入式操作系统内核是嵌入式系统加电运行后的管理平台,负责实时性任务和多任务的管理。

⏹文件系统是嵌入式系统软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分;它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。

4.2 接口和时序的划分

⏹一个复杂的系统可能存在多种存储类型的接口,需要根据实际的系统设计对此加以正确配置。

对同一种存储器类型来说,也因为访问速度的差异,需要不同的时序配置。

通常Flash和SRAM同属于静态存储器类型,可以共用同一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。

⏹存储器端口的接口时序是非常重要的,这会影响到整个系统的性能。

因为一般系统运行的速度瓶颈都存在于存储器的访问,所以存储器访问时序应尽可能地快;但同时又要考虑由此带来的稳定性问题,只有根据多次测试后才能确定最佳的时序配置。

4.3 存储器地址重映射(remap)

⏹当一个系统上电后,程序将自动从0地址开始执行,因此在系统的初始状态,必须保证在0地址处存在正确的代码,即要求0地址开始处的存储器是非易性的ROM或Flash等。

但是因为ROM或Flash的访问速度相对较慢,每次中断发生后,都从读取ROM或Flash上面的中断向量表开始,影响了中断响应速度。

因此,有的系统便提供一种灵活的地址重映射方法,可以把0地址重新指向到RAM中去。

在这种地址映射的变化过程中要注意:

程序的执行流程不能被这种变化所打断。

ARM系统引导bootloader

1、环境设置

硬件环境

⏹ARM为内核的处理器、存储器和必要的外部接口与设备。

⏹内嵌ARM7TDMI的Samsung公司的S3C4510处理器

⏹存储器使用2MB的Flash和16MB的SDRAM

⏹外部接口除了用于下载和通信的串口,还配备了一个以太网接口

软件环境

⏹系统引导程序、嵌入式操作系统内核、文件系统。

⏹系统引导程序通常也称为bootloader,代码量虽少,但是作用非常大,相当于PC上的BIOS,负责将操作系统内核固化到Flash中和系统初始化工作,然后将系统控制权交给操作系统。

⏹嵌入式操作系统内核是嵌入式系统加电运行后的管理平台,负责实时性任务和多任务的管理。

ARM7TDMI是一款没有MMU的处理器,因此采用μCLinux作为本系统的操作系统内核。

μCLinux是Linux是一个分支,专为无MMU的处理器设计。

⏹文件系统是嵌入式系统软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分。

它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。

软件分区

⏹软件平台固化在Flash中。

通常根据软件平台的内容对Flash的地址空间进行分区,一般分三个区,分别存放bootloader、μCLinux内核和文件系统。

⏹分区方式有两种:

⏹一种是根据三个部分预定的存储空量,允许bootloader、内核和文件系统拥有自己固定的分区和首地址;该方式,虽然可能会浪费一部分Flash空间,但是方便内核的加载和文件系统的挂载,同时也利于系统的调试和开发。

⏹另一种就是按照这三部分的实际分配区间,一个部分紧跟着另一个部分后存储,没有固定的分区和首地址。

可以充分利用Flash的存储区间,节约成本。

2、系统配置

系统固化

⏹固化常见方法

JTAG口;将内核和文件系统的映像文件烧写到指定的Flash位置上

以太网接口;将映像文件下载到Flash中

串口;将映像文件烧写到Flash。

⏹本系统采用采用串口烧写Flash

这是因为一方面配置一个串口方便且廉价,而JTAG烧写还要配置昂贵的JTAG仿真器和相关的驱动程序以及协议转换程序,网口下载还要有以太网支持;

另一方面μCLinux默认通过串口打印其运行的信息,那么串口不但可以提供烧写Flash的功能,还可作为调试μCLinux内核的通道。

⏹固化的信息内容:

在本系统中,Flash在刚开始时,只存储了bootloader,存储μCLinux内核,文件系统

系统初始化

⏹在本系统中,Flash在刚开始时,只存储了bootloader,还没有存储μCLinux内核和文件系统。

因此bootloader在系统加电完成初始化工作后,要初始化一条链接主机和目标机的串口通道,并提供串口下载功能。

⏹因为系统刚加电时,操作系统的内核还没有被加载,系统的初始化工作由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