ARM bootloader程序的理解

作为一个嵌入式工程师,如果不能写bootloader程序,那就不能成为一个真正的嵌入式工程师.以前做linux driver,常对bootloader程序是一知半解,其实要写好bootloader程序还得好好去研读一下处理器 architecture.

ARM 处理器是一种很热门的嵌入式处理器,现在绝大部分的嵌入式产品都用到了ARM处理器,其低廉的价格和丰富的性能都受到的消费者的青睐.下面针对ARM处理器来具体谈一下ARM bootloader程序.

首先简单的了解一下ARM architecture.ARM主要由ARM内核单元,vector interface ,coprocessor,两种cache(instruction and data),两种TCM(instruction and data), MMU, power management等. cache是为了平衡数据之间的速度而使用的,而TCM是为了存储一些频繁使用的数据,如中断向量等,MMU主要处理虚拟地址到物理地址的转换,起到了对数据的保护作用,用在操作系统的体系中,很显然,bootloader程序就是要为后来的程序提供一个良好的运行环境,这里对ARM architecture的几个组成单元进行必要的配置.

综上所述,ARM bootloader程序主要完成下面几个功能:

1)初始化栈.

2)中断向量表的复制.

3)TCM 和cache的配置,如果有操作系统的话,就应该设置MMU.

4)建立一个程序执行文境.(具体一点,就是根据image文件的属性来处理image段的数据).

5)对内存如mddr,sram进行简单的测试.

6)需要设置一些外围设备,一般来说需要配置一下串口.

一、初始化栈:

应该对irq,firq,svc的栈进行指定,分别操作这几中模式的寄存器。如对irq模式.

mov r0 , #0x12; irq mode

msr CPSR , r0; set irq mode

ldr sp, =0x800; irq steak address

二、中断向量表的复制:

Boot_Def
ldr PC,Arm_Addr_Ini ;0x00
ldr PC,Arm_Addr_Und ;0x04
ldr PC,Arm_Addr_Swi ;0x08
ldr PC,Arm_Addr_Pre ;0x0C
ldr PC,Arm_Addr_Abt ;0x10
nop ;0x14
ldr PC,Arm_Addr_Irq ;0x18
ldr PC,Arm_Addr_Fiq ;0x1C

Arm_Addr_Ini DCD bootstrap_entry + 0x00 ;0x20
Arm_Addr_Und DCD undefined_exception_handler ;0x24
Arm_Addr_Swi DCD software_interrupt_handler ;0x28
Arm_Addr_Pre DCD prefetch_exception_handler ;0x2C
Arm_Addr_Abt DCD abort_exception_handler ;0x30
Arm_Addr_Irq DCD irq_interrupt_handler ;0x34
Arm_Addr_Fiq DCD fiq_interrupt_handler ;0x38

DCD 0x12345678 ; 0x3c

...

ldr r0,=Boot_Def
ldr r1, =0x0 ;address 0x0
mov r2,#0x3C
add r2, r2, r1

0
cmp r1, r2
bge %b1
ldrcc r3,[r0],#4
strcc r3,[r1],#4
b %B0
1

三、TCM的配置

TCM和cache是有区别的,虽然都是为了加快速度,但是TCM必须给它指定地址,TCM和cache的用途也不样,TCM保存常用到的数据如中断向量表和realtime数据,而cache只是为了加快处理器和外设之间的数据处理。

ldr r0, =0x0;
mrc p15, 0, r1, c9, c1, 1;读coprocessor instruction tcm region register.
orr r0, r0, r1;
mov r1, #1
orr r1, r1, r0;instruction tcm bit_o 置1,enable insturction tcm.
mcr p15,0,r1,c9,c1,1;写入

其它的cache配置也类似,主要读懂ARM document.

四、建立一个程序运行文境:

image(bin文件)包括俩部分:RO and RW,RO部分一般我们在加载前后的位置都不用变化,但是RW必须在加载后把他放到RAM中执行,所以RW部分我们把它映射到RAM地址中。

IMPORT |Image$$RO$$Base| ;image RO 开始地址
IMPORT |Image$$RO$$Limit|
IMPORT |Image$$RO$$Length|
IMPORT |Image$$RW$$Base|
IMPORT |Image$$RW$$Limit|
IMPORT |Image$$RW$$Length|
IMPORT |Image$$ZI$$Base|
IMPORT |Image$$ZI$$Limit|
IMPORT |Image$$ZI$$Length|

ldr r0,=|Image$$RO$$Limit|
ldr r1,=|Image$$RW$$Base|
ldr r2,=|Image$$RW$$Limit|

3
cmp r1,r2
bge %B3
ldrcc r3,[r0],#4;从RO段的结束地址+1load rw段数据
strcc r3,[r1],#4;重新写入到rw段
b %B4
4

ldr r0,=|Image$$ZI$$Base|;处理ZI段数据
ldr r1,=|Image$$ZI$$Length|
add r1, r1, r0
ldr r1, =0X2000
ldr r2,=0
5
cmp r0, r1
bge %B6
strcc r2,[r0],#4;初始化ZI段数据为0
b %B5
6

五、对内存进行测试:

由于系统中有各种各样的内存,可以对内存进行简单测试。

六、UART的配置:

UART在嵌入式系统中很重要,虽然它很简单,但是在早期开发中,UART是必须的设备之一。UART作为下一篇中将进一步详细讨论。

更多相关文章
  • QT Sqlite ARM 编写程序是本文要介绍的内容,主要是代码,先来看内容. #include <QApplication> #include <QTextEdit> #include <QString> #include <qsqldatabase.h ...
  • 


    		    02,计算机组成与操作系统的理解、对程序的理解、OS发展史、Linux常见版本 以及 一些杂项
    这里马哥讲了好多,能听懂,但需要记得东西好少,不过我还是 按照 我 对 计算机 的 理解 画了 一张 图, 不一定 准确 , 但是 差不多 把, 计算机 底层 是 由 运算器.控制器.存储器.输入设备.输出设备 这 五大部件 组成 的 其中 运算器 和 控制器 是 在 cpu 中 的, 运算器 是 ...
  • 


    		    ARM上的Bootloader的具体实现1071098736
    BootLoader简介: 当完成用户程序的编译并下载到目标板上运行时,总是要首 先进行存储器的映射,然后通过 ADS(或 SDT)调试环境下载,显然,这个过程对 普通用户来说显得特别烦琐,然而,要在裸板(没有任何程序的系统板)上调试运 行程序,也只能采用这种方法. 如果能在用户设计的系统板上烧写一 ...
  • [摘要]编译器保证volatile自己的读写有序,但由于optimization和多线程可以和非volatile读写interleave,也就是不原子,也就是没有用.C++11 supposed会支持atomic operation. ^C^V的原帖在这里-- 这篇文章详细剖析了为什么在多核时代进行
  • (一)关于ARM处理器Remap的理解 0.什么是Remap 我的理解是:在ROM从0x0用几句指令引导系统之后,把RAM映射到0x0就是Remap. 1.Remap的作用 当ARM处理器上电或者Reset之后,处理
  • RO段.RW段和ZI段 要了解RO,RW和ZI需要首先了解以下知识: ARM程序的组成 此处所说的"ARM程序"是指在ARM系统中正在执行的程序,而非保存在ROM中的bin映像(image)文件,这一点清注意区别. 一个ARM程序包含3部分:RO,RW和ZI.RO是程序中的指令和 ...
  • 这是嵌入式开发中常用的几个专业术语,其诞生的背景和其具体作用大概如下 在很久很久以前,那是8051单片机流行的时代,做单片机开发都需要一个专用工具,就是单片机的编程器,或者叫烧写器.说"烧"写一点不为过,当年的经典芯片AT89C51在编程时需要十几伏的高电压,加在一个特定的引脚上 ...
  • 简介 ARM是Advanced RISC Machine的首字母缩写,它可以称之为一家嵌入式处理器的提供商,也可以理解为一种处理器的架构,还可以将它作为一套完整的处理器指令集. 原生程序与ARM汇编语言 对于使用ARM处理器的Android手机来说,它最终会生成相应的ARM elf可执行文件,分析软 ...
一周排行
  • 函数 Python不仅非常灵活地定义函数,而且本身内置了很多有用的内置函数,可以直接调用. 借助于抽象,我们不会关心底层的具体计算过程,而直接在更高的层次上思考问题. 函数就是最基本的一种代码抽象的方式. 调用函数
  • Achieving High Availability and Scalability
    Achieving High Availability and Scalability: 
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http ...
  • 问题:之前接触过Ibatis的使用,在做一对多的时候,一般都是手动去填充,非自动让ibatis去填充数据. 下面就用ibatis的自动填充功能来实现. 关键使用到collection 标签下的select标签. 现在
  • 1.释放shp文件锁定: C#中确保没有引用后调用GC.Collect(); 或使用在独立的类中使用shp文件,然后手动释放该类的实例. 2.raster ExtractValuesToPoints中点数据在sde中
  • 在XCode5中,如果我们添加一个Button或者Label,或者其他的什么标准View,而不设置任何constraints,IB会自动生成constraints,而这些constraints是fixed,无法根据i
  • iOS6新特征:UICollectionView介紹
    目录(?)[-] Collection View 元素 数据模型与交互 数据模型数据提供者 ...
  • http://www.cnblogs.com/songdavid/articles/2067534.html 调用EBS标准API的时候,可能会返回一些让人看不懂的错误,比如最近我在开发rcv_transaction
  • <SQL Server 2设计与T-SQL编程> <SQL Server 2设计与T-SQL编程>笔记1 http://dukedingding.blog.sohu.com/39485495. ...
  • Sccm2012客户端卸载步骤 1.在已经安装好客户端的机器上运行cmd; 2.定位到C:\windows\ccmsetup 文件夹; 3.键入ccmseup.exe /uninstall 敲回车即可; 4.注意卸载