微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM7嵌入式系统中Bootloader分析与设计

ARM7嵌入式系统中Bootloader分析与设计

时间:11-11 来源:互联网 点击:
1.引言

作为一种16/32位的高性能、低成本、低功耗嵌入式RISC(Reduced Instruction Set Computer)微处理器,ARM(Advanced RISC Machines )微处理器目前已经成为应用最为广泛的嵌入式微处理器[1]。在嵌入式系统开发中Bootloader常常是嵌入式系统开发中可能遇到的第一个技术难点。应用程序运行环境能否正确构建,内核能否启动成功,都取决于Bootloader能否正确的工作。一个功能完善的嵌入式系统Bootloader还要求能够提供系统更新的能力,以及为了实现这一操作所需要的一个简单的命令控制台。本文在基于ARM7-uClinux嵌入式系统的硬件平台和软件平台基础上,描述了系统引导程序Bootloader的设计原理,阐述了设计时应考虑的因素和需解决的技术难点并给出了一套可行的引导程序流程。

2.系统组成

典型的ARM嵌入式系统硬件平台一般包括一个以ARM为内核的处理器、存储器和必要的外部接口与设备。在本系统中采用内嵌ARM7TDMI的Samsung公司S3C4510B处理器,存储器使用2MB的Flash和16MB的SDRAM,外部接口除了可用于下载和通信的串口,还配备了一个以太网接口以支持S3C4510B的网络功能。

软件平台由系统引导程序、嵌入式操作系统内核和文件系统组成,系统引导程序通常即指我们这里的Bootloader,其代码量虽少但是作用非常大,相当于普通PC机中的BIOS。通过Bootloader,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核准备好正确的环境。

3.Bootloader 设计分析

3.1 Bootloader 的操作模式 (Operation Mode)

大多数 Bootloader 都包含两种不同的操作模式[2]:

(1). 启动加载(Boot loading)模式:也称为“自主”模式。即Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。

(2).下载(Downloading)模式:在这种模式下,目标机上的Bootloader将通过串口或网络连接等通信手段从主机(Host)下载内核映像和根文件系统映像等,然后保存到目标机上的FLASH 类固态存储设备中。Bootloader的这种模式通常在系统初次安装和更新时被使用,工作于这种模式下的Bootloader通常都会向它的终端用户提供一个简单的命令行接口。

在我们的Bootloader设计中我们同时支持这两种工作模式,采用的方法是:一开始启动时处于正常的启动加载模式,但并不立即启动进入uClinux内核,而是提示延时5秒,等待终端用户如果按下某一特定按键,则切换到下载模式,否则继续启动uCLinux 内核。

3.2 Bootloader 的启动及初始化

基于ARM的芯片多数为复杂的片上系统(SoC),这类复杂系统里的多数硬件模块都是可配置的[3]。因此大多数 Bootloader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,通常都放在 stage1 中,而且在这一部分,我们直接对处理器内核和硬件控制器进行编程,因此常常都用汇编语言来实现。而stage2则通常用C语言来实现,这样可以实现更复杂的功能,而且代码会具有更好的可读性和可移植性。

3.2.1 Bootloader的stage1

这部分代码必须首先完成一些基本的硬件初始化,为stage2的执行以及随后的kernel 的执行准备好一些基本的硬件环境[2]。Bootloader的stage1一般通用的内容包括:

* 定义程序入口点

* 设置异常向量表

* 初始化存储系统(包括地址重映射)

* 初始化有特殊要求的端口,设备

* 初始化用户程序的执行环境

* 初始化堆栈指针寄存器,必要时改变处理器的模式

* 设置FIQ/IRQ中断处理程序入口

* 进入C程序

在整个Bootloader的初始化过程中我们都不必响应中断,因此首先禁止系统的中断,然后程序设置CPU的速度和时钟频率,设置CPU内部指令/数据cache,DRAM初始化,DRAM初始化完成后即可拷贝ROM中的代码到DRAM中,然后内存重映射,程序开始进入DRAM中执行,然后再初始化一些用户有特殊要求的端口、设备,比如LED或串口等,可以通过点亮LED,或者向串口打印一些调试信息,以此表明系统的状态是OK还是Error。然后准备进入C语言代码:拷贝Bootloader的RW/RO 段到相应的运行位置,初始化ZI段,初始化系统堆栈,设置FIQ/IRQ中断处理程序入口,设置完成就可以进入到C代码了。

3.2.2 Bootloader的stage2

为了让程序跳入C语言的“main”函数,我们采用直接将pc指针指向“main”函数的方法,实现代码如下:

[ THUMBCODE ; [ = IF , 如果是汇编Thumb代码,则采用bx指令跳转

bx lr

| ; | = ELSE

mov pc, lr ; 汇编ARM代码,则直接跳转到main函数

] ; ]

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top