arm 嵌入式系统 bootloader
引言: 对于 pc 机,其开机后的初始化处理器配置、硬件初始化等操作是由 bios(basic input /output system)完成的,但对于嵌入式系统来说,出于经济性、**方面的考虑一般不配置 bios,因此我们必须自行编写完成这些工作的程序,这就是所需要的开机程序。而在嵌入式系统中,通常并没有像 bios 那样的固件程序,启动时用于完成初始化操作的这段**被称为 bootloader 程序,因此整个系统的加载启动任务就完全由 bootloader 来完成。
简单地说,通过这段程序,可以初始化硬件设备、建立内存空间的映射图(有的 cpu 没有内存映射功能如 s3c44b0),从而将系统的软硬件环境设定在一个合适的状态,以便为最终调用操作系统内核、运行用户应用程序准备好正确的环境。bootloader依赖于实际的硬件和应用环境,因此要为嵌入式系统建立一个通用、标准的 bootloader 是非常困难的。bootloader也依赖于具体的嵌入式板级设备的配置,这也就是说,对于两块不同的嵌入式主板而言,即使它们是基于同一 cpu 而构建,要想让运行在一块板子上的 bootloader 程序也能运行在另一块板子上,通常都需要修改 bootloader 的源程序。
二。 启动流程
系统加电复位后,几乎所有的 cpu都从由复位地址上取指令。比如,基于 arm7tdmi内核的 cpu 在复位时通常都从地址 0x00000000 处取它的第一条指令。而以微处理器为核心的嵌入式系统通常都有某种类型的固态存储设备(比如 eeprom、flash等)被映射到这个预先设置好的地址上。
因此在系统加电复位后,处理器将首先执行存放在复位地址处的程序。通过集成开发环境可以将 bootloader 定位在复位地址开始的存储空间内,因此bootloader是系统加电后、操作系统内核或用户应用程序运行之前,首先必须运行的一段程序**。对于嵌入式系统来说,有的使用操作系统,也有的不使用操作系统,比如功能简单仅包括应用程序的系统,但在系统启动时都必须执行 bootloader,为系统运行准备好软硬件运行环境。
系统的启动通常有两种方式,一种是可以直接从 flash 启动,另一种是可以将压缩的内存映像文件从 flash(为节省 flash 资源、提高速度)中复制、解压到 ram,再从 ram 启动。当电源打开时,一般的系统会去执行 rom(应用较多的是 flash)里面的启动**。这些**是用汇编语言编写的,其主要作用在于初始化 cpu 和板上的必备硬件如内存、中断控制器等。
有时候用户还必须根据自己板子的硬件资源情况做适当的调整与修改。
系统启动**完成基本软硬件环境初始化后,对于有操作系统的情况下,启动操作系统、启动内存管理、任务调度、加载驱动程序等,最后执行应用程序或等待用户命令;对于没有操作系统的系统直接执行应用程序或等待用户命令。
启动**是用来初始化电路以及用来为高级语言写的软件做好运行前准备的一小段汇编语言,在商业实时操作系统中,启动**部分一般被称为板级支持包,英文缩写为 bsp。它的主要功能就是:电路初始化和为高级语言编写的软件运行做准备。
系统启动流程如图 1所示,主要的过程如下:
1. 启动**的第一步是设置中断和异常向量。
2. 完成系统启动所必须的最小配置,某些处理器芯片包含一个或几个全局寄存器,这些寄存器必须在系统启动的最初进行配置。
3. 设置看门狗,用户设计的部分外围电路如果必须在系统启动时初始化,就可以放在这一步。
4. 配置系统所使用的存储器,包括 flash,sram 和dram 等,并为他们分配地址空间。如果系统使用了 dram 或其它外设,就需要设置相关的寄存器,以确定其刷新频率,数据总线宽度等信息,初始化存储器系统。
有些芯片可通过寄存器编程初始化存储器系统,而对于较复杂系统通常集成有 mmu 来管理内存空间。
5. 为处理器的每个工作模式设置栈指针,arm 处理器有多种工作模式,每种工作模式都需要设置单独的栈空间。
6. 变量初始化,这里的变量指的是在软件中定义的已经赋好初值的全局变量,启动过程中需要将这部分变量从只读区域,也就是 flash拷贝到读写区域中,因为这部分变量的值在软件运行时有可能重新赋值。还有一种变量不需要处理,就是已经赋好初值的静态全局变量,这部分变量在软件运行过程中不会改变,因此可以直接固化在只读的 flash或 eeprom中。
7. 数据区准备,对于软件中所有未赋初值的全局变量,启动过程中需要将这部分变量所在区域全部清零。
8. 最后一步是调用高级语言入口函数,比如 main函数等。
三。 程序分析
下面根据实际经过测试的**详细讲述系统的启动过程。
text /*将此操作符开始的**编译到**段或**段子段中*/
* 集成开发环境(ide)可以通过链接脚本文件将下面的语句定位在零起始地址,系统上电后 cpu从此处开始执行*/
entry:
b resethandler /*跳至 resethandler,此句被定位在零起始地址*/
*除用户模式外的其他 6种模式称为特权模式。特权操作模式主要处理异常和*调用(有时称为软件中断),它们可以自由的访问系统资源和改变模式。特权模式中除系统模式以外的 5 种模式又称为异常模式,下面的**用于出现异常时 cpu 就会根据以下的语句自动跳转到对应的异常处理程序处*/
b handlerundefhandlerundef
b handlerswiswi interrupt handler */
b handlerpaborthandlerpabort
b handlerdaborthandlerdabort
bhandlerreserved */
b handlerirq
b handlerfiq
resethandler: /上电后跳转到此处开始执行*/
ldr r0,=wtcon /*禁止看门狗*/
ldr r1,=0x0
str r1,[r0]
ldr r0,=intmsk /*屏蔽所有中断请求 */
ldr r1,=0x07ffffff
str r1,[r0]
/*设置时钟控制寄存器*/
ldr r0,=locktime
ldr r1,=0xfff
str r1,[r0]
if pllonstart
ldr r0,=pllcon /*设置 pll */
ldr r1,=(m_div<<12)+(p_div<<4)+s_div) /fin=8mhz,fout=64mhz*/
str r1,[r0]
endif
ldr r0,=clkcon
ldr r1,=0x7ff8所有单元时钟允许*/
str r1,[r0]
*为 bdma设置复位值*/
ldr r0,=bdides0
ldr r1,=0x40000000 /*bdidesn 复位值应为 0x40000000 */
str r1,[r0]
ldr r0,=bdides1
ldr r1,=0x40000000 /*bdidesn 复位值应为 0x40000000 */
str r1,[r0]
*设置存储器控制寄存器,存储器的配置数据都存储在 smrdata为起始地址的数据表中,下面的**可以一次将预先配置好的初始化数据存入与存储器控制器相关的 13 个寄存器,这些寄存器则是以 0x01c80000 为起始地址的 13 个连续的 32 位寄存器*/
ldr r0,=smrdata
ldmia r0,
ldr r0,=0x01c80000 /*bwscon存储控制寄存器地址 */
stmia r0,
*初始化堆栈*/
* cpu复位后是处于管理模式下的,所以首先要初始化管理模式下的堆栈寄存器*/
ldr sp, =svcstack
*由于处理器的每种运行模式都要有自己独立的物理堆栈寄存器 r13,在用户应用程序的初始化部分,一般都要初始化每种模式下的 r13,使其指向该运行模式的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入 r13 所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈中恢复,采用这种方式可以保证异常发生后程序的正常执行*/
bl initstacks /*跳转至其它堆栈初始化程序并返回*/
*设置 irq中断处理*/
*44b0 有两种中断模式:一种是没有中断向量表;一种是使用了中断向量表,使用中断向量表只能是 irq方式。当使用中断向量表的时候,中断发生时由 s3c44b0 的中断控制器根据中断向量表,利用硬件方式自动跳转到相应的中断处理服务程序所在的位置;不使用中断向量表时按下面的**,利用软件方式跳转而进行中断处理,因为 s3c44b0 有30 个中断源,所以需要程序判断以确定调用那个中断服务程序*/
ldr r0,=handleirq /*如果在0x18 和0x1c 地址处无“subs pc,lr,#
ldr r1,=isrirq /*为了中断正常返回这些语句是必须的 */
str r1,[r0]
*拷贝读写区域数据/数据区准备,将系统需要读写的数据和变量从 rom拷贝到 ram里。image_ro_limit、image_rw_base、image_zi_base等这些符号还会在另外的链接脚本文件**现,这些符号是用来定位程序各个段的参考信息。集成开发环境在编译链接的时候会根据我们编写的程序,把它们转换成用来对各个段定位的地址信息*/
嵌入式ARM嵌入式系统设计
摘要 本系统设计了基于arm系统的嵌入式硬件平台,其中主要介绍了系统母版的具体电路实现,其硬件电路已经通过了信号完整性分析。中国 网 关键词 arm 嵌入式系统 中图分类号 tp368.1 文献标识码 a 文章编号 1007 9416 2012 12 0104 01 1 序言 本系统是设计一款基于a...
嵌入式系统ARM试题
一 选择题。1 以下说法不正确的是 b a 任务可以有类型说明 b 任务可以返回一个数值。c 任务可以有形参变量 d 任务是一个无限循环。2下列描述不属于risc计算机的特点的是 c a 流水线每周期前进一步。b 更多通用寄存器。c 指令长度不固定,执行需要多个周期。d 独立的load和store指...
嵌入式系统设计arm复习
1.什么是嵌入式系统?其特点有些什么?答 嵌入式系统是 以应用为中心 以计算机技术为基础 软件硬件可裁剪 功能 可靠性 成本 体积 功耗严格要求的专用计算机系统。特点 1 软硬件一体化,集计算机技术 微电子技术 行业技术于一体 2 需要操作系统支持,小,执行速度快 3 专用紧凑,用途固定,成本敏感 ...