Chinaunix首页 | 论坛 | 博客
  • 博客访问: 582018
  • 博文数量: 146
  • 博客积分: 5251
  • 博客等级: 大校
  • 技术积分: 1767
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-10 15:58
文章分类
文章存档

2010年(12)

2008年(129)

2007年(5)

我的朋友

分类:

2008-02-04 11:17:07

摘要:本文总结了基于S3C44B0X芯片的Bootloader代码设计的一般流程,具体说明了Bootloader完成的主要任务,实现方法和地址重映射的概念;给出了S3C44B0X在基于uCLinux操作系统的嵌入式应用中,Bootloader的引导过程及关键技术和代码,有着很好的借鉴价值。
关键词: 嵌入式系统  Bootloader代码  地址重映射  S3C44B0X  uCLinux  

1 引言

近年来,ARM在嵌入式设备中的应用越来越广泛。S3C44B0X就是Samsung公司生产的基于ARM7架构的微处理器。uCLinux是专门为无MMU处理器设计的嵌入式操作系统,支持ARM、Motorola等处理器。采用ARM+uCLinux作为嵌入式开发平台,吸取了两者优点,是一种比较流行的开发方式。在ARM程序设计中,启动代码是至关重要的,它不仅初始化硬件系统本身,而且最终引导进入操作系统,所以启动代码的设计直接影响整个开发的正常进行。本文结合S3C44B0X的特点详细给出了Bootloader设计和启动过程。

2 BootLoader代码

    Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要是为操作系统提供基本的运行环境,由它最终将操作系统启动起来并将控制权交给操作系统内核。

Bootloader代码由汇编代码和C代码两部分组成。由于资源有限,Bootloader、uCLinux内核映象、文件系统(Ramdisk压缩映象)通常都是固化在Flash中的。在S3C44B0X架构的嵌入式系统中,为了保证上电或复位时正常运行,Bootloader必须存放在Flash(0x0-0x400000,

4M)中的0x0处,则在硬件设计中把Flash接在CPU的nGCS0处[1]。上电后Bootloader首先完成存储器、堆栈、寄存器、全局变量和基本硬件模块的初始化,这由汇编代码完成,然后将操作系统内核与文件系统调入SDRAM(0x0c000000-0x0c800000,8M)中,并将PC指针指向操作系统内核的入口处,为操作系统的运行作好准备,这由C代码完成。

3 BootLoader代码设计流程

    ARM芯片多数为复杂的片上系统(SOC),系统里许多硬件模块都可由软件来设置。系统的初始化直接联系到处理器内核和硬件控制器,进行编程一般用汇编语言。根据具体的目标系统,Bootloader的设计流程包括:⑴设置异常向量表 ⑵初始化存储器系统 ⑶堆栈初始化 ⑷C例程全局变量初始化 ⑸呼叫主程序

3.1 设置异常中断向量表

ARM处理器的中断向量表从地址0x0处开始存放,连续有8×4字节的空间。在ARM存储空间里每个字32位,占4个字节。可以通过图1来描述中断向量表的地址分配。

每当有中断或者异常发生时,ARM处理器便强制把PC指针指向向量表中对应中断类型的地址值。为了加快中断响应,我们在Flash的0x0地址存放能跳转到0x0c000008地址处中断向量的跳转指令,即在RAM中建立一个二级中断向量表,起始地址为0x0c000008,除复位外,其它异常入口地址由Flash跳转得到,如表1所示:

       图 1 中断向量表                 表 1 异常向量表跳转关系

3.2 初始化存储器系统

存储器系统的初始化是指对Flash、RAM存储器的地址范围,数据总线宽度及DRAM的刷新等进行软件设置。设置对象是存储器控制寄存器,芯片不同具体的设置不同。本文仅以开发中用到S3C44B0X为例,说明这部分程序设计的过程。

memsetup:  ldr       r0, =MEMORY_CONFIG

               ldmia       r0, {r1-r13}

               ldr          r0, =0x01c80000

               stmia       r0, {r1-r13}

其中MEMORY_CONFIG地址处定义了配置rBWSCON, rBANKCONn(n=0-7),rREFRESH,

rBANKSIZE,rMRSRB6,rMRSRB7寄存器的值(依次为0x11000100,0x700,0x700,0x7ffc,0x7568

,0x700,0x700,0x18008,0x18000,0xac03e1,0x16,0x020,0x020)。

图 2 地址映射关系

地址重映射通常把位于Flash的0x0处异常向量表映射到更快、更宽(32bit/16bit)的RAM中,并把0地址重新指向到RAM中去.图2描述了Remap前后的地址映射关系,复位时ROM定位到0x0,实际的跳转地址为ROM的Reset Handler处,Remap后0x0的ROM替换为RAM,并把中断向量表拷贝到0x0。Remap的实现和ARM处理器硬件特性相关。在S3C44B0X系统中,既没有MMU也不支持Remap,为了实现快的启动和异常处理速度,在Bootloader程序设计中,我们把RAM中的0x0c000008地址当成0x0地址处理,即在这里开始存放程序中断向量,而在Flash的0x0地址存放能跳转到0x0c000008地址处中断向量的跳转指令。支持Remap的处理器有的通过寄存器的相应Bit位置1来完成,有的通过软件设计改写Memory起始地址的Bank寄存器完成[2]

阅读(1238) | 评论(0) | 转发(0) |
0

上一篇:ARM 指令格式和时序

下一篇:内核管理概述

给主人留下些什么吧!~~