基于ARM Cortex-M3的BootLoader技术

时间:2022-10-23 05:35:31

基于ARM Cortex-M3的BootLoader技术

(武昌理工学院信息工程学院,湖北武汉430223)

摘要:本文主要介绍了基于ARM Cortex-M3内核的BootLoader技术的源代码组成、结构和设计思路,通过掌握其启动原理,以便于更好地应用BootLoader。

关键词:ARM Cortex-M3 ; 源代码;启动原理;BootLoader技术

中图分类号:TP273文献标识码:A

1.引言

现今嵌入式系统越来越受到人们的重视。随着系统复杂程度的提高,小型化和网络化也成为嵌入式系统发展的必然趋势。如何利用现成的通信网络,安全、快捷的对各个节点控制器进行在线软件升级(ISP),成为了嵌入式系统发展的一项重要课题,对工业控制、航空航天、通信等领域意义重大。而实现这一功能,需要一段核心代码的支持,这段代码就是BootLoader。

2. BootLoader 简介

2.1 功能介绍

BootLoader 是位于 Flash 起始地址处的一小段代码,占据空间默认为 2K。如果没有BootLoader,硬件启动成功后,将直接运行用户应用程序(Application)。反之,BootLoader的启动代码(Start-up Code)将先被执行,进行一系列的初始化操作后,根据预先设定的条件,选择执行用户应用程序(Application)或升级控制程序(Updater)。

Updater在升级Flash的过程中,需要与上位机通信,通信的端口可选用UART,SSI,I2C或以太网端口。为了保证数据的无差错传输,BootLoader采用了控制传输的通信协议:UART,SSI,I2C端口均采用了自定义的串行加载协议;而以太网采用了UDP协议。对接收到的格式正确且校验成功的数据包,Updater能够将其解包,并将得到的加载命令转化为对Flash底层寄存器的操作。

2.2 源代码组成

BootLoader的源代码由多个文件组成,如表1所示。

表1:BootLoader 源代码组成

文件分类 文件名 文件说明

启动代码 bl_startup_ewarm.S BootLoader 启动代码

配置文件 bl_config.h 定义 BootLoader 配置选项

bl_config.c

数据包收发 bl_packet.h 定义 Updater 命令及响应代码

bl_packet.h 串行数据包收发控制

bl_packet.c

数据传输 bl_enet.c 以太网端口数据传输

UART bl_uart.h UART 端口数据传输

bl_uart.c

bl_autobaud.h

SSI bl_ssi.h SSI 端口数据传输

bl_ssi.c

I2C bl_i2c.h I2C端口数据传输

bl_i2c.c

升级控制 bl_check.h 检测 Updater 运行条件

bl_check.c

bl_main.c 升级控制主程序及升级端口配置

其它 bl_decrypt.h Application 代码加密控制

bl_decrypt.c

bl_link.xcl IAR EWARM 链接器脚本文件

3.BootLoader 技术

3.1BootLoader 的启动原理

3.1.1 Cortex-M3 存储及启动机制

Cortex-M3 内核具有固定的存储器映射,这使得相同内核的芯片具有了更好的兼容性。

特定厂商

专用外设总线

外部总线

外部RAM

片内外设

SRAM(保留区)

SRAM

代码(保留区)

Flash

图1:Cortex-M3 存储器系统示意图

如图1所示,Cortex-M3 的地址空间中,0~0.5G被映射为Flash空间,0.5G~1G被映射为SRAM空间。由于SRAM是易失性存储器,故系统上电时,SRAM中并没有内容,系统必须从Flash开始启动。

Flash 空间起始地址处必须存放向量表。向量表是异常产生时获取异常处理函数入口的一块连续内存,每一个异常都在向量表固定的偏移地址处(偏移地址以字对齐),通过该偏移地址可以获取异常处理函数的入口指针。向量表中前4个字分别为:栈顶地址、复位处理函数地址、NMI ISR 地址、硬故障 ISR 地址。一张向量表至少由这四项组成。

在程序代码开始运行后,向量表的基地址也可以改变。通过软件设置 NVIC 中的向量表偏移寄存器(NVIC_VTABLE,0xE000ED08),可以在任意 32 字对齐处建立向量表。

启动原理如下:硬件复位时,NVIC_VTABLE 复位为 0,向量表默认位于 Flash 空间起始地址处(0x00000000)。内核读取向量表第 1 个字设置主堆栈(SP_main),读取第 2 个字设置 PC 指针,之后跳转到复位处理函数中运行。自此,系统的控制权交由软件接管。

3.1.2 BootLoader 启动代码原理

BootLoader 启动需先执行以下一系列操作:

 配置向量表

 初始化存储器

 复制 BootLoader 代码到 SRAM

 从 SRAM 中执行代码

BootLoader 的作用之一,是提供运行时修改 Flash 的功能。这样,如果内核直接从 Flash 中加载修改其自身的指令,则既容易造成时序上的混乱,又有可能因 Flash 中某些关键指令被自修改而导致整个系统崩溃。

针对这个问题,采取的方案为:在SRAM中建立BootLoader的映像,即把BootLoader复制到SRAM中,然后从SRAM中加载指令。如图2所示。这样,指令的加载源(SRAM)与修改操作的目标(Flash)相分离,一定程度上保证了软件升级的可靠性和安全性。这样的存储器映射允许修改Flash的全部代码。此外,BootLoader也提供了保护机制,用于保护Flash中的BootLoader代码本身,以及Flash空间顶部的一段存储区(保存即使Flash升级也不需要擦除的代码)。除非相应的配置选项使能,否则,这两段代码不可随意修改。

图2: BootLoader 内存示意图

在IAR集成开发环境的BootLoader版本中,启动代码包含在bl_startup_ewarm.S文件中。BootLoader复位处理函数ResetISR将首先调用ProcessInit子函数,来实现BootLoader的复制,见程序清单1。

程序清单1ProcessInit 子函数

ProcessorInit

movsr0, #0x00000000

ldrr1, =0x20000000

ldrr2, =SFB(DATA_Z)

copy_loop

ldrr3, [r0], #4

strr3, [r1], #4

cmpr1, r2

bltcopy_loop;复制 BootLoader 到 SRAM

movsr0, #0x00000000

上一篇:现场总线技术的应用与发展前景 下一篇:新百亿酒企的基因