[LM3_SN]BootLoader.pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《[LM3_SN]BootLoader.pdf》由会员分享,可在线阅读,更多相关《[LM3_SN]BootLoader.pdf(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、LM3Sxxxx 学习笔记第三章Boot Loader 现今,嵌入式系统越来越受到人们的重视。随着系统复杂程度的提高,小型化和网络化也成为嵌入式系统发展的必然趋势。如何利用现成的通信网络,安全、快捷的对各个节点单片机进行在线软件升级(ISP),成为了嵌入式系统发展的一项重要课题,对工业控制、航空航天、通信等领域意义重大。而实现这一功能,需要一段核心代码的支持,这段代码就是BootLoader。Luminary Micro 公司设计并生产的Stellaris 系列单片机,基于先进的ARM Cortex-M3 内核,芯片提供的高效的性能、广泛的集成功能,适用于各种关注成本并明确要求具有过程控制以及
2、连接能力的应用方案。不可多得的是,Luminary 官方提供了BootLoader 的全部源代码,大大减小了开发难度。本章将分析Stellaris BootLoader 的组成、结构及设计思路,试图掌握其关键技术,以更好地应用BootLoader。3.1 简介BootLoader 是 位 于Flash 起 始地 址 处的 一小 段代 码,占 据空 间默 认 为2K。如果 没 有BootLoader,硬件启动成功后,将直接运行用户应用程序(Application)。反之,BootLoader 的启动代码(Start-up Code)将先被执行,进行一系列的初始化操作后,根据预先设定的条件,选择执
3、行用户应用程序(Application)或升级控制程序(Updater)。Updater 在升级Flash 的过程中,需要与上位机通信,通信的端口可选用UART,SSI,I2C 或以太网端口。为了保证数据的无差错传输,BootLoader采用了控制传输的通信协议:UART,SSI,I2C 端口均采用了自定义的串行加载协议;而以太网采用了 UDP 协议。对接收到的格式正确且校验成功的数据包,Updater 能够将其解包,并将得到的加载命令转化为对Flash 底层寄存器的操作。由于官方提供了BootLoader 的全部源代码,用户也可自行修改通信端口、通信协议等相关组件,使其更好地符合用户需求。B
4、ootLoader 的源代码由多个文件组成(图3.1):图 3.1 BootLoader 文件组成在图 3.1 中可以看出主要有6 个文件组成部分,同时还有几个头文件。bl_packet.c 串行数据包收发控制bl_uart.c UART 端口数据传输bl_autobaud.h 自动获取波特率bl_ssi.c SSI 端口数据传输LM3Sxxxx 学习笔记3.2 原理分析3.2.1 存储器映射图 3.2 存储器映射总体来说,Cortex M3 支持 4GB 存储空间,如图3.2 所示地被划分成若干区域。从图 3.2 中可见,不像其它的ARM 架构,它们的存储器映射由半导体厂家说了算,Corte
5、xM3预先定义好了“粗线条的”存储器映射。通过把片上外设的寄存器映射到外设区,就可以简单地以访问内存的方式来访问这些外设的寄存器,从而控制外设的工作。结果,片上外设可以使用C 语言来操作。这种预定义的映射关系,也使得对访问速度可以做高度的优化,而且对于片上系统的设计而言更易集成(还有一个重要的,不用每学一种不同的单片机就要熟悉一种新的存储器映射)。CortexM3的内部拥有一个总线基础设施,专用于优化对这种存储器结构的使用。在此之上,CM3 甚至还允许这些区域之间“越权使用”。比如说,数据存储器也可以被放到代码区,而且代码也能够在外部RAM 区中执行(但是会变慢不少)。处于最高地址的系统级存储
6、区,是CM3 用于藏“私房钱”的包括中断控制器、MPU 以及各种调试组件。所有这些设备均使用固定的地址。通过把基础设施的地址定死,就至少在内核水平上,为应用程序的移植扫清了障碍。由于Cortex-M3内核具有固定的存储器映射,这使得相同内核的芯片具有了更好的兼容性Cortex-M3 的地址空间中,00.5G 被映射为 Flash 空间,0.5G1G 被映射为SRAM 空间。由于 SRAM是易失性存储器,故系统上电时,SRAM 中并没有内容,系统必须从Flash 开始启动。Flash 空间起始地址处必须存放向量表。向量表是异常产生时获取异常处理函数入口的一块连续内存,每一个异常都在向量表固定的偏
7、移地址处(偏移地址以字对齐),通过该偏移地址可以获取异常处理函数的入口指针。向量表中前4 个字分别为:栈顶地址、复位处理函数地址、NMIISR 地址、硬故障ISR 地址。一LM3Sxxxx 学习笔记张向量表至少由这四项组成。在程序代码开始运行后,向量表的基地址也可以改变。通过软件设置NVIC 中的向量表偏移寄存器(NVIC_VTABLE,0 xE000ED08),可以在任意32 字对齐处建立向量表。3.2.2 硬件启动原理Stellaris 系列单片机硬件启动原理如下:硬件复位时,NVIC_VTABLE复位为 0,向量表默认位于Flash 空间起始地址处(0 x00000000)。内核读取向量
8、表第1 个字设置主堆栈(SP_main),读取第2 个字设置 PC 指针,之后跳转到复位处理函数中运行。自此,系统的控制权交由软件接管。3.2.3 Boot Loader启动原理BootLoader 启动需先执行以下一系列操作:配置向量表、初始化存储器、复制BootLoader 代码到SRAM、从SRAM 中执行代码。BootLoader 的作用之一,是提供运行时修改Flash 的功能。而由于Stellaris 系列单片机具有单周期的Flash 读写能力,因此默认的代码段本身就位于Flash 中。这样,如果内核直接从Flash 中加载修改其自身的指令,则既容易造成时序上的混乱,又有可能因Fla
9、sh 中某些关键指令被自修改而导致整个系统崩溃。图 3.3 BootLoader 复制针对这个问题,Stellaris 系列单片机采取的方案为:在SRAM 中建立BootLoader 的映像,即把BootLoader 复制到 SRAM 中,然后从 SRAM 中加载指令。如图 3.3 所示。这样,指令的加载源(SRAM)与修改操作的目标(Flash)相分离,一定程度上保证了软件升级的可靠性和安全性。这样的存储器映射允许修改Flash 的全部代码。此外,BootLoader 也提供了保护机制,用于保护Flash 中的 BootLoader代码本身,以及Flash 空间顶部的一段存储区(保存即使Fl
10、ash 升级也不需要擦除的代码)。除非相应的配置选项使能,否则,这两段代码不可随意修改。LM3Sxxxx 学习笔记在 Keil 版本的Boot Loader 中有这样一段代码,用于Boot Loader 复制到 SRAM 中,请看下面一段代码:01.EXPORT Reset_Handler 02.Reset_Handler 03.;04.;Call the C library enty point that handles startup.This will copy the.data section initializers from 05.;flash to SRAM and zero f
11、ill the.bss section.It will then call _rt_entry,which will be either the 06.;C library version or the one supplied here depending on the configured startup type.07.;08.IMPORT _main 09.;10.;Copy the code from flash to RAM 11.;12.mov r0,#0 13.mov r1,#0 x20000000 14.orr r2,r1,#0 x0800 15.copy_loop 16.l
12、dr r3,r0,#4 17.str r3,r1,#4 18.cmp r1,r2 19.bne copy_loop 20.b _main 从上面一段代码中可以看出,Boot Loader 占用 0 x800 个单元,上面代码的作用是从Flash 中把Boot Loader 复制到 SRAM 中,并调到 _main 函数中去运行,实际上是运行SRAM 中的 Boot Loader。3.2.4 运行条件在 SRAM 中映像建立完毕并开始执行后,BootLoader 将检测某特定引脚(默认的是PB4,也可以自己修改为其它管脚)的极性,该极性可通过硬件修改,以决定运行Application 还是 Up
13、dater(默认情况下,复位时PB4 引脚为低则运行Updater,为高则运行Application),如图3.4 所示。引脚的选择及其极性的意义可在配置文件中修改。LM3Sxxxx 学习笔记图 3.4 运行条件3.2.5 由 BootLoader 加载 Application 由 BootLoader 加载Application,与系统复位后直接加载Application 有所不同。区别在于,在运行 BootLoader 的系统中,Application 的向量表并不位于Flash 起始地址处。Application 有自己的向量表,且不与BootLoader 共用向量表。这样做的目的,就是
14、将BootLoader 本身与Application 分离开来,使两者具有一定的独立性。这也是由实际应用决定的:BootLoader 需在系统投入使用之前编译完成并通过JTAG 口或其它方式烧写进单片机,而Application 作为Flash 的升级程序,则通常在系统运行一段时间后才编写完成。向量表能够分离,关键在于向量表偏移寄存器(NVIC_VTABLE)的使用。如表3.1 所示。在硬件启动时,该寄存器会被复位为全0,即向量表位于Flash 空间起始地址处;当 BootLoader 在 SRAM中建立映像之后,该寄存器被设置为0 x20000000,表示向量表位于SRAM 空间 起 始 地
15、 址 处;如果 选 择 执 行 Application,那 么 该 寄 存 器 又 被 设 置 为 APP_START_ADDRESS(默认为0 x800,即2K),表示用户应用程序的向量表位于Flash 空间BootLoader 以上的某一地址处(BootLoader 的代码量不能超过APP_START_ADDRESS)。表 3.1 向量表偏移取值由 BootLoader 加载 Application 的关键代码:01.;*02.;This function reads the stack pointer from the base address passed in and also mo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- LM3_SN BootLoader
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内