打印
[资料分享]

关于TIVA Bootloader的说法,觉得讲的很好,分享一下

[复制链接]
2533|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 xyz549040622 于 2015-4-29 10:13 编辑

(1) BootLoader 的概念
        BootLoader, 顾名思义,是 Boot( 启动) 的时候起到 Loader( 加载器) 作用的代码,即系统刚一上电启动,最先被执行的一段代码, 根据这段代码的安排,系统的其余部分会被它加载( Load)并运行。
       上述对 BootLoader 的解释对从来没听说过它的读者来说估计仍然是难以理解的。 你可能还会问:知道 BootLoader 又能怎样? 有什么用? 它跟我学 MCU 有什么关系吗? 我从你最熟悉的手机开始讲。 相信你一定有手机, 而且很可能是智能手机( 它们安装了不同的操作系统, 比如是 Android, iOS,Windows Phone, Symbian)。 如果你“与时俱进”,你可能还经常升级手机上的系统, 就是我们常说的“刷机”。手机上的系统升级就是要用到BootLoader, 如果你有刷机经验, 最明显的感受是你要先下载一个新版本的系统,通常那个玩意被简称为固件( firmware)或者映像(Image), 再把新版系统通过某种方式加载到你的手机里才能更新原来的系统, 而且这个过程一定会伴随着手机的重新启动。当旧版操作系统正在运行时, 你的手机里的一切活动由旧版系统掌控, 一山不容二虎,新版系统不能和旧版系统同时存在于你的手机上。新版系统覆盖旧版系统的那一段时间内, 旧版系统不可能掌控手机, 因为它正逐步被覆盖,新版系统也不可能掌控手机,因为它还没有完全更新到手机上。 必须有人站出来处理这事,那就是 BootLoader。 BootLoader 被放在系统的某一个特定的地方,每次系统一上电, 它都会比任何其它程序先运行。 如果没有系统更新的任务, 它就老老实实加载旧版本系统运行; 如果有新的系统要更新,它就会加载新系统, 覆盖旧系统,这个过程中它掌握了一切。当新系统加载完,它把掌控权转交给新系统。 总而言之, BootLoader 就是一个加载器,它不是加载已有的程序运行,就加载新的程序覆盖已有的程序。它的出现让手机用户更新手机系统可以自己完成,而无需去找厂商(要知道十多年前手机换系统必须去找厂家或其代理点)。
        如果你熟悉个人计算机( PC)并有过 PC 的 DIY 经验( 现在用笔记本电脑的人占多数,只有用台式 PC 才会有更多的 DIY 机会), 也许听说过“ BIOS”这个名字, 它的部分功能就是 BootLoader, PC 一上电就会先执行 BIOS 程序,然后由它来加载系统( 比如Windows2)。它是打开电源后最新执行的程序, 最明显的证据是当你拿到一个新的机器,没有安装任何系统前也能进入 BIOS 设置窗口。

相关帖子

沙发
xyz549040622|  楼主 | 2015-4-29 10:15 | 只看该作者
(2) Tiva 的 BootLoader
        在 PC 里, BIOS 通常存放在主板上的一块 ROM 里, PC 一上电默认找到这块 ROM 内的程序执行;在 Tiva 系列 MCU 系统里, 起到类似 PC 里 ROM 的功能的是闪存( Flash 存储器,简称 Flash) , BootLoader 是存放在 Flash 起始地址处的一小段代码,占据默认大小为 2K 字节的空间。 Tiva 的 BootLoader 有两种可配置的加载功能, 其一是加载用户应用程序( Application); 其次是与其它设备建立标准通信通路,并从该设备上加载新的系统软件来更新( Update)原有的系统。更新的过程通过对固件( Firmware)的烧写来实现。 烧写固件也是那些经常更新手机系统的用户比较熟悉的术语。系统上电后 BootLoader 内的启动代码( Start-up Code)将先被执行, 进行一系列的初始化操作后,根据预先设定的条件,选择执行用户应用程序或更新控制程序( Updater)。
        我们在 PC 上安装新系统时会通常要从光盘或者 U 盘把这个新系统加载到系统的硬盘上。Tiva BootLoader 的 Updater 在升级的过程中,是通过某种通信方式联接到别的设备上,把那个设备上的系统加载到 Tiva 的 Flash 中。 Tiva C 系列的芯片它可能采用的通信有UART0, SSI0, I2C0, CAN, USB 或以太网端口。 数据通信必须确保无差错, 为了保证数据的无差错传输, BootLoader 采用了控制传输的通信协议。当采用 UART0, SSI0, I2C0 和CAN 这些端口通信时, BootLoader 要求用户自定义串行通信协议,来确保更新过程中的通信可靠性, 将要更新到 Flash 上的系统软件集合也叫固件映像( Firmware Image),为了减少数据通信量, Firmware Image 通常某种数据压缩形式被压缩成一个包)。 而采用以太网或 USB 时,因为这两种接口都有现成的支持更新功能的协议,所以无需用户自定义协议。用以太网为接口时采用了标准 BOOTP( Standard Bootstrap Protocol); 而 USB 接口则采用标准 DFU ( Standard Device Firmware Upgrade)。对接收到的格式正确且校验成功的数据包,Updater 能够将其解包,并将得到的加载命令转化为对 Flash 底层寄存器的操作。
        由于 TivaWare 提供了 BootLoader 的全部源代码,用户也可自行修改通信端口、通信协议等相关组件,使其更好地符合用户需求。

使用特权

评论回复
板凳
复仇者联盟a| | 2015-4-29 10:18 | 只看该作者
轻轻地飘过,看贴必回

使用特权

评论回复
地板
xyz549040622|  楼主 | 2015-4-29 10:46 | 只看该作者
(3) Tiva C 系列的存储空间分布和启动机制
      为了使同一系列的处理器有更好的兼容性, Cortex M4F 的内核存储器映射是按表 2-1固定分配的。Cortex M4F 的地址空间中, 0~0.5G 之间的空间被分配(一般称为映射)为 Flash 空间,0.5G~1G 被映射为 SRAM。因为 SRAM 是易失性存储器,系统刚上电时, SRAM 中没有内容,因此系统必须从 Flash 开始启动。Flash 空间起始地址处必须存放异常向量表( Exception Vector)。 异常向量表与其它单片机中的中断向量表功能类同,只是异常比中断的含义更广。向量表是在内存指定位置上的一张由多个单元组成的表, 表中的每个单元都对应着某一种异常, 也事先按约定的顺序排好,这样,每个异常对应的向量表的位置在硬件上是固定的。 当某个异常产生时,我们需要程序自动跳转到异常处理程序所在的位置。 但系统不知道这个位置,所以我们将这个地址放在异常向量表里,系统知道异常的类型,根据类型找到向量表中与此类型对应的异常向量单元。 向量单元在 Tiva 中由 4 个字节组成, 用来存放程序地址信息。

        系统复位时, 向量表的地址是固定在 0x0000.0000 的,具有系统级权限的软件可以在程序代码开始运行后修改向量表的起始地址。 修改的方式是通过软件设置 NVIC 中的向量表偏移寄存器( NVIC_VTABLE, 0xE000ED08), 向量表的地址可以修改为 0x0000.0400 到0x3FFF.FC00 之间的位置。注意: 修改后的起始地址是 4 的倍数,用于 32 位齐, 同时留下 1024 字节的表空间。Cortex M4F 系列单片机硬件启动原理如下:硬件复位时, NVIC_VTABLE 复位为 0,向量表默认位于 Flash 空间起始地址处( 0x00000000)。内核读取向量表第 1 个单元设置主堆栈( SP_main),读取第 2 个单元设置 PC 指针,之后跳转到复位处理函数中运行。 复位处理函数获得系统的控制权, 复位处理函数通常就是系统的用户应用程序。 这就是没有BootLoader 时系统的调用应用程序的方式。

使用特权

评论回复
5
xyz549040622|  楼主 | 2015-4-29 10:53 | 只看该作者
(4) BootLoader 的启动代码( Startup Code)
        BootLoader的启动代码是一小段精简代码,它要完成( 1) 配置向量表; ( 2) 初始化存储空间的分布;( 3) 复制BootLoader代码到SRAM;( 4) 从SRAM中执行代码等一系列操作。
        由于配置向量表和初始化存储空间的分布与用户使用的开发工具的编译器和链接器有关,所以每种工具都有它自己对应的启动代码实现和链接配置文档。与CCS相关的启动代码和链接配置脚本分别在:
bl_startup_ccs.s ( TI CCS的启动代码)
bl_Link_ccs.com (配置文档)
        配置完向量表并初始存储空间后, 启动代码复制 BootLoader 代码到 SRAM。 由于BootLoader 的作用之一,是提供运行时修改 Flash 的功能。而由于 Tiva 系列单片机具有单周期的 Flash 读写能力,因此默认的代码段本身就位于 Flash 中。这样,如果内核直接从Flash 中加载修改其自身的指令,则既容易造成时序上的混乱,又有可能因 Flash 中某些关键指令被修改而导致整个系统崩溃。针对这个问题, Tiva 系列单片机采取的方案为:在SRAM 中建立 BootLoader 的映像,即把 BootLoader 复制到 SRAM 中,然后从 SRAM 运行代码来修改在 Flash 中的代码。 图 2-2 所示。

        这样,执行代码的位置( SRAM)与修改操作的目标( Flash)相分离,一定程度上保证了软件升级的可靠性和安全性。这样的存储器映射允许修改 Flash 的全部代码。此外,BootLoader 也提供了保护机制,用于保护 Flash 中的 BootLoader 代码本身,以及 Flash 空间顶部的一段存储区(保存即使 Flash 升级也不需要擦除的代码)。除非相应的配置选项使能,否则,这两段代码不可随意修改。
        在 SRAM 中映像建立完毕并开始执行后, BootLoader 将调用 CheckForceUpdate()来决定运行 Application 还是 Updater。 CheckForceUpdate()会检测应用程序是否有效并检测用户配置的专用于升级的 GPIO 端口是否出现规定的电平特性。应用程序是否有效的判断依据是:( 1)堆栈指针是否指向一个有效的位置(这个位置应当在 SRAM 里, 即指针值应当是 0x2xxx.xxxx);( 2) 复位处理程序的地址是否是一个有效位置(这个位置应当在 Flash里, 地址应当是 0x000x.xxxx, 而且必需是偶数)。 上述两个条件都满足, 表示应用程序有效。如果用户没有在 BootLoader 的配置文件 bl_config.h 里配置检测 GPIO 管脚(通过ENABLE_UPDATE_CHECK 来配置),且应用程序有效, BootLoader 就选择执行用户应用程序。 反之,只要应用程序无效, 或用户要求检测 GPIO 某管脚( 通常那个管脚接一个按钮) 且此管脚电平符合要求( 一般设计成按钮按下), BootLoader 执行升级程序。( 默认复位时 PB4 引脚为低则运行 Updater,为高则运行 Application),如图 2-3 所示。引脚的选择及其极性的意义可在配置文件中修改。

        由 BootLoader 加载 Application,与系统复位后直接加载 Application 有所不同。区别在于,在运行 BootLoader 的系统中, Application 的向量表并不位于 Flash 起始地址处。Application 有自己的向量表,且不与 BootLoader 共用向量表。这样做的目的,就是将BootLoader 本身与 Application 分离开来,使两者具有一定的独立性。这也是由实际应用决定的: BootLoader 需在系统投入使用之前编译完成并通过 JTAG 口或其它方式烧写进单片
机,而 Application 作为 Flash 的升级程序,则通常在系统运行一段时间后才编写完成。
        向量表能够分离,关键在于向量表偏移寄存器( NVIC_VTABLE)的使用。在硬件启动时,该寄存器会被复位为全 0,即向量表位于 Flash 空间起始地址处;当 BootLoader 在SRAM 中建立映像之后,该寄存器被设置为 0x20000000,表示向量表位于 SRAM 空间起始地址处;如果选择执行 Application,那么该寄存器又被设置为 APP_START_ADDRESS(默认为 0x800,即 2K),表示用户应用程序的向量表位于 Flash 空间 BootLoader 以上的某一地址处( BootLoader 的代码量不能超过 APP_START_ADDRESS)。

使用特权

评论回复
6
hanzhenfei| | 2015-4-30 12:35 | 只看该作者
可以

使用特权

评论回复
7
djz1992| | 2016-7-11 10:37 | 只看该作者
找的就是这个,我想用外部flashrom来保存要升级的代码,然后自动升级,是不是要
1、配置完向量表并初始存储空间后, 启动代码复制 BootLoader 代码到 SRAM(怎么配置向量表和复制代码?)
2、一定要用一个引脚来控制updater吗?如果引脚为低,需要运行updater,那怎么把这个updater指向我的外部flashrom,来编译并运行外部flashrom里的代码?

使用特权

评论回复
8
xyz549040622|  楼主 | 2016-7-12 08:44 | 只看该作者
djz1992 发表于 2016-7-11 10:37
找的就是这个,我想用外部flashrom来保存要升级的代码,然后自动升级,是不是要
1、配置完向量表并初始存 ...

你自己研究下官方给的boot代码,他们有实现的。

使用特权

评论回复
9
原田夜舞| | 2016-7-14 22:05 | 只看该作者
谢谢了

使用特权

评论回复
10
xyz549040622|  楼主 | 2016-7-14 22:07 | 只看该作者
djz1992 发表于 2016-7-12 11:07
在哪里有下载呢

tiva ware开发包中的例程中有的。

使用特权

评论回复
11
shiqiaocanxue| | 2016-8-3 21:38 | 只看该作者
大神,问一下如果用FLASH存储程序运行中实验数据,需要怎样设置?我试着直接存就可以,但我担心会不会把Flash中的应用程序覆盖?

使用特权

评论回复
12
xyz549040622|  楼主 | 2016-8-3 22:11 | 只看该作者
shiqiaocanxue 发表于 2016-8-3 21:38
大神,问一下如果用FLASH存储程序运行中实验数据,需要怎样设置?我试着直接存就可以,但我担心会不会把Fla ...

写flash数据的地址和程序存储的空间不要一样就可以了。

使用特权

评论回复
13
shiqiaocanxue| | 2016-8-4 13:27 | 只看该作者
xyz549040622 发表于 2016-8-3 22:11
写flash数据的地址和程序存储的空间不要一样就可以了。

我故意把数据写到应该是存放程序的地址,比如0x1000或0x2000,好像也是可以的,Bootloader不会提供保护应用程序的机制吗?我如果在程序中对FLASH随便写入,应用程序不会乱套了吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:qq群: 嵌入式系统arm初学者 224636155←← +→→点击-->小 i 精品课全集,21ic公开课~~←←→→点击-->小 i 精品课全集,给你全方位的技能策划~~←←

2782

主题

19267

帖子

104

粉丝