|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区
您需要 登录 才可以下载或查看,没有账号?立即注册
×
固件开发人员提供足够多的开发时间。事实上,嵌入式固件开发就好像气体一样,会占据它所在的整个空间。而这往往意味着项目结束阶段的测试和质量评估承受压力,进而提高风险。项目经理为如何跟上项目计划进度发愁, | 嵌入式设计人员和测试工程师也面临开发时间和测试覆盖质量之间的矛盾。要是所有人都能实现自己的目标该多好。要是硬件设计能在代码完成前就进一步推进该多好。要是固件测试在生产构造阶段也能继续进行该多好。要是整个团队都能明确如果设计情况不好,他们总是能够通过现场升级实现重大修改该多好。这样,所有人晚上都能睡个安稳觉,而通过适当利用嵌入式 | 引导加载程序bootloader
首先我们先明确一下有关术语。引导加载程序是一段常驻微处理器中的代码,有时也位于只读存储器(ROM)中(在工厂制造时编写)或者位于板载闪存存储器的预留区域。可加载引导代码能载入内存并作为正常工作期间在微处理器上运行的主应用代码。可加载引导代码可通过引导加载程序更新。产品固件的现场升级正是通过板载引导加载程序实现的。
那么,什么是引导加载程序呢?引导加载程序就是位于给定微控制器上受保护程序存储器中的一部分代码。它通常是加电启动或重启后运行的第一个软件,往往针对具体处理器和电路板。引导加载程序可视为一种“笨”代码,因为它并不了解需要执行什么应用,甚至也不了解器件功能是什么。引导加载程序专门用来理解如果通过任意数量的通讯协议与外部进行通讯(这些协议包括UART、I[sup]2[/sup]C、SPI、CAN、以太网等),也可用来了解微控制器的存储器映射。引导加载程序在发挥作用时,负责与外部或主机进行通讯;读取主机发送的数据文件;更新它所在的微处理器,从而运行所提供的最新应用代码。
图1:典型的嵌入式硬件架构。
引导加载程序可以在接收到人工操作员(也就是手动重启)或外设设备(即系统主机)的启动信号后开始工作,视具体嵌入式系统而定。引导加载程序信号首先确认引导加载程序本身是否有效,明确当前器件应用是否有效,与主机通讯并载入提交的新应用,随后根据指令执行应用闪存重写。大多数现代微控制器都能对自己的闪存重新编程。典型的引导加载程序在几微秒内就能完成这一工作。不过,存储器尺寸较大情况下,该时间就会大幅延长,有时甚至要花几秒钟才能完成一次更新。一旦完成加载引导,引导加载程序必须确认加载引导镜像,并将控制权交给加载引导代码。用于中断矢量的指针也必须进行设置。典型情况下,引导加载程序将进行软重启,以便让应用掌握控制。图2给出了引导加载程序的逻辑流程实例。
图2:引导加载程序的逻辑流程。
由于引导加载程序是在制造过程中被编程到器件中,并且不是器件工作所必需的首要应用,因此实际上可以把它看作是“开销”代码。项目经理和嵌入式设计人员必须要考虑引导加载程序所带来的风险保护功能与其所占用的代码空间相比是否值得。由于这段代码要占用空间,许多设计人员需要尽可能减小引导加载程序的存储器占用量,从而将用于应用代码的存储器空间实现最大化。引导加载程序至少应提供:通讯通道、擦写并重新编程闪存存储器的方法以及确认和执行新应用代码的方法。
此外,引导加载程序应该能够检测、报告和处理加载引导操作过程中出现的错误,如断电、通讯损失、闪存写入错误等。一般通过存储应用的校验和或循环冗余代码(CRC)来实现闪存错误保护功能。加载引导操作开始后,这些位就会被清空。如果新的应用成功下载并安装,校验和就会被更新。如果下载过程中出错(通讯损失、断电等),那么引导加载程序会检测无效的校验位,且不会开始应用操作,而是与主机通讯,等待有效的加载引导操作。 |
|