文档库 最新最全的文档下载
当前位置:文档库 › BOOTLOADER的原理及设计要点

BOOTLOADER的原理及设计要点

Electronic

Component&DeviceApplications

Vol.10No.1Jan.2008

第10卷第1期

2008年1月0引言

RTU(RemoteTerminalUnit)在水情、电力、

石化等行业发挥了非常重要的作用。随着工业自动化水平的不断提高,人们对RTU不断提出更高的要求,而为了满足一些最新需求,就必须对

RTU的程序进行升级。目前对这类终端设备的程

序维护大多采用开发或工程人员携带专用编程工具到现场进行更新的方式。这样做工作量极大,费资费时费力,对整个系统的统一管理和维护造成很大困难,同时也给系统运行带来较大影响。

利用在应用编程(IAP,InApplicationPro-

gram)技术,用户可在数据采集中心对远程RTU

进行升级,而且更新时间快,基本不会影响系统运行。此外,当在单片机中烧入这样一个Boot

loader程序并建立IAP后,其最基本的开发环境就

简化成了“PC+RS232电缆+目标板”

。IAP的本质是使MCU灵活运行一个常驻Flash

的引导加载程序(BootLoaderProgram),从而实现对用户应用程序的在线自编程更新。现在,许多单片机都具备BootLoader功能,虽然各厂家的

BootLoader可能不尽相同,但基本原理一样,本

文将以MEGA128单片机为例来简要介绍Boot

Loader的原理、设计方法及其设计注意事项。

1BootLoad的原理

BootLoader实际上就是驻留在Flash中的一段

代码,它可为MCU下载和上传程序代码提供一个

真正的同时读-写(Read-While-Write,RWW)

自编程机制。这一特点使得系统可以在MCU的控制下,通过驻留于程序Flash的BootLoader,来灵活地进行应用软件升级。

2MEGA128的BootLoader设计

目前,很多单片机都有BootLoader功能,有

些是出厂前就写好了的,单片机从上电或复位开始便运行这段程序代码,以判断当前是否需要进入升级状态。如果不需要升级,就直接运行Flash中的原有程序;如果需要升级,则通过某种通信方式接收新的程序文件,并将原有程序用新文件覆盖。而有些单片机本身并不提供BootLoader功能,但提供BootLoader区,以便用户根据需求编写自己的BootLoader程序,从而实现更为灵活的

BootLoader功能。ATMEL公司推出的MEGA128则

将这种灵活性发挥的淋漓尽致。

2.1BootLoader区大小的选择

MEGA128的BootLoader区大小可以由BOOT-

SZ熔丝位来配置,这给用户带来了很大的选择灵

活性。在出厂默认配置下,BOOTSZ=00,也即

BootLoader区为从¥F000开始的4K字。用户可以

通过改写BOOTSZ来更改其大小。如果bootloader区程序非常小,用户甚至可以将BootLoader区设定为512字以扩大应用程序的空间。笔者认为,如果应用程序不是非常大,最好能保留其4K字的配置,这一方面可减少一步改写熔丝位的工作量,另一方面也预留了BootLoader的扩展能力。

编译BootLoader程序必须根据BOOTSZ熔丝

收稿日期:2007-06-22

BOOTLOADER的原理及设计要点

曹翊军,薛升宁,郭保龙

(南京自动化研究院,江苏

南京

210003)

要:介绍了通用引导装载程序的原理。以美国ATMEL公司的MEGA128单片机为例,给

出了在AVR系列单片机中通过编写bootloader来实现程序的本地及远程下载的方法及要点。关键词:bootloader;MEGA128;RTU;IAP;CVAVR;远程下载

Vol.10No.1Jan.2008

第10卷第1期

2008年1月

位的设置来将Project-Configure-CCompiler选项中的程序类型(ProgramType)更改为BootLoader-

xxxxw,其中,xxxx为BOOTSZ设定的BootLoader

区的大小。

2.2BootLoader程序进入方式的选择

BootLoader的本质就是驻留在FLASH中的一

段程序。要进入BootLoader程序,程序指针PC必须指向该程序的起始位置。用户可以通过在应用程序接收到特殊指令后,通过JMP语句直接跳转到BootLoader程序的开始位置去执行更新流程。此外,MEGA128还可通过更改BOOTRST熔丝位来将复位向量直接指向BootLoader程序,这样,每次MEGA128复位时,都将直接运行BootLoader流程。但用户在BootLoader中必须判断是否需要更新应用程序,如果不需要,经过超时时间后则退出BootLoader,接着进入应用程序。

后一种方式的优点是应用程序与BootLoader完全隔离,没有相关性,不会出现应用程序与

BootLoader程序不匹配的情况,也不会出现应用

程序出现故障而无法进入BootLoader的情况。但这种方式不太可取的原因是现场环境一般比较恶劣,如果遇到强干扰或程序跑飞,就很可能导致程序复位,这样,程序就会进入BootLoader流程,而在超时退出的这段时间内极有可能丢掉重要的数据,而且这个时间还不能太短,因为太短有可能导致正常的更新操作无法完成。因此,笔者更倾向于采用第一种方式。

2.3数据接口方式及协议的选择

BootLoader程序可以使用任何器件所具有的

数据接口来获取数据,包括串口、并口、I2C、

SPI、USB等;但从实际使用来看,使用串口无疑

是最方便的。这一方面是几乎所有的单片机都集成了UART接口,要进行RS232通信只需要增加一个RS232/TTL电平转换芯片就可以了;另一方面,大多数通信终端都具有RS232接口,这也为远程更新提供了有利条件。因此,利用串口进行更新也成为目前应用最多的方案。

BootLoader程序可使用任何协议来传输数据。

目前,比较常见的是采用标准XMODEM协议来进行数据的传输,采用这种方式的优点是比较简

单、不需要另外编写专门的上位机程序,只需要使用PC机自带的超级终端软件并使用XMODEM传输文件即可。但这种方式的软件界面不够人性化,缺乏交互性,没有进程指示,下载过程中出现错误也不能停止下来,而且,在使用最常用的三线方式通信时(没有控制信号),超级终端采用的是比较保守的方式发送数据,发送一包数据后会等待较长时间再发下一包数据,这样会使更新程序的速度比较慢。尤其是在远程更新程序时,速度较慢对远程更新的可靠性是致命的打击。因此,笔者抛弃了采用超级终端进行升级的方式,而是将BootLoader命令嵌入到自己的本地和远程通信协议中,然后利用专门编写的上位机软件来进行数据的传输。

3MEGA128的BootLoader具体实现

完成了以上各项选择工作,接下来就可以开

始进行实际的BootLoader程序设计了。

由于本设计选择从应用程序跳转的方式进入

BootLoader,因此,该BootLoader的设计应包括

应用程序和BootLoader区的设计两部分。

3.1应用程序的设计

应用程序的设计相对比较简单,只需在应用

程序中嵌入一条特殊的指令识别语句,这样,当接收到这一特殊指令后,系统将执行以下语句以跳转到BootLoader:

#asm("jmp0xf000");

其中,0xf000为BootLoader的首地址。

3.2BootLoader区的设计

BootLoader区的程序一般可分为两个部分,

一部分是与硬件单片机相关的FLASH擦写功能模块函数,一般用汇编语言编写,这也是整个Boot

Loader的核心模块;另一部分为应用程序模块,

一般用C语言编写,以增强程序的可读性。

MEGA128中的Flash被分成两个固定的区:

同时读写区(RWW)和非同时读写区(NRWW)。

BootLoader软件工作时,用户软件不能读取位于RWW区内的任何代码。如果用户软件在编程过

程中试图读取位于RWW区的代码,软件可能会终止于一个未知状态。为了避免这种情况的发

设计参考

生,首先需要禁止中断或将其转移到BootLoader区。本文采用禁止中断的方案。

程序存储器的更新以页的方式进行。在用临时页缓冲区存储的数据对一页存储器进行编程时,首先要将这一页擦除。通过SPM指令以一次一个字的方式将数据写入临时页缓冲区。临时页缓冲区的写入可以在页擦除命令之前完成,也可以在页擦除和页写操作之间完成。由于在页擦除之前写临时页缓冲区可以把要擦除的内容先读出,因而可以在原有内容下改写某几个字节,因此,在这里采用这种方式。

最后,程序必须能自动执行应用程序,这可以通过执行以下语句来实现:

#asm(“jmp0x0000”);

另外,在退出之前,还需完成几个初始化工作。首先,由于某些编译器会自动将中断向量转移到BootLoader区,因此,必须在以上语句前将中断向量重新搬移到应用程序区的头部,这可通过以下两条语句来完成:

MCUCR=0x01;

MCUCR=0x00;

而在改写0X8000以上地址的内容时,应将RAMPZ的内容改写为1,且在跳转到应用程序前还必须将其清零。BootLoader区程序的整个流程如图1所示。

4BootLoader的设计要点

BootLoader本身是个锦上添花的设计,因而必须避免其成为鸡肋。BootLoader程序应该具有很好的可维护性和可靠性,并应能正确处理异常情况,而不会因为意外情况而引起系统的损坏或崩溃。其可靠性可以从以下三方面去考虑:(1)避免应用程序错误进入BootLoader程序

BootLoader是进行程序更新的流程.它有可能改写应用程序,所以一定要尽量避免错误进入BootLoader流程,这也是笔者不建议使用复位进入BootLoader流程的原因。

(2)合理选择进入BootLoader程序的时间点

BootLoader包括程序文件的接收和FLASH的改写两个部分。目前,很多BootLoader的设计都采用边接收文件边改写FLASH的方法,这种方式在本地更新的时候危害不大,一般来说本地数据传输的可靠性比较高。然而,如果是采用远程更新的方式,远程传输的可靠性会大大降低。如果远程传输失败,将直接导致BootLoader失败,而这种失败则可能是致命的,因为应用程序有可能被改写了一部分,这时候的程序将处于一种不可预知的状态,而要恢复这种状态只能到现场使用专用工具来进行串行或并行编程。

因此,笔者采用了将文件接收和单片机FLASH改写分为两步走的方式。一般情况下,应用程序将正常运行,而在接收到特殊指令后,则将进入更新文件接收流程,其接收到的文件将放在外部的串行FLASH中,更新文件接收成功后再通过JMP指令跳转到BootLoader程序,并在BootLoader程序中只执行从串行FLASH中读出的程序内容来改写单片机上FLASH的工作,改写完成后再自动跳转到应用程序。这种方式的最差情况也只会导致程序更新失败,而不会导致应用程序的崩溃。这样,在信道恢复正常后,仍可进行程序更新工作,因而大大提高了可靠性。

(3)尽量提高更新速度

速度的提高首先需要从数据源开始。目前有的设计采用的是直接传输HEX文件的方式,但这种方式是不可取的,因为HEX文件一般会比BIN文件大三倍以上,而且HEX文件不能直接写入单片机,还必须经过一个转换的过程,这又增加了一点时间消耗。因此,笔者建议在程序更新前,先通过hextobin软件将HEX文件转换成BIN文件。

更新时间主要取决于文件的传输时间,在本地更新过程中,提高本地RS232

图1BootLoader区的程序流程

(下转第66页)

其它特定占空比(D=5%,20%,40%,

60%,80%,95%)的仿真记录数据如表1所列。

图7所示是该调压电路的PWM信号占空比与Vs调压偏移量的变化曲线。由图可见,该变化呈线性关系。

6结束语

本文通过提高PWM调制信号的频率,再结合

二阶有源滤波电路,实现了频率到电压的一种转换。该转换可在40Vdc~60Vdc范围内,对ZXC10通信电源的输出电压通过PWM信号进行线性调节,这种方法可以避免使用较贵的D/A转换模块,因而可以节省成本,同时也提高了该电源的工程使用价值。

参考文献

[1]STC12C2052AD系列单片机器件手册,2006.

[2]

潘永雄.新编单片机原理与应用[M].西安:西安电子科技大学出版社,2003.

[3]康华光.模拟电子电路[M].北京:高等教育出版社,

2002.

[4]

鬲淑芳,段新文.模拟电子技术基础[M].西安:陕西师范大学出版社,2000.

表1

其它特定占空比下的Vs仿真数据

占空比D(%)

5%20%40%60%80%

95%

VS(V)1.500

1.754

2.091

2.428

2.7663.018

传输的波特率将减少更新时间,但在远程更新过程中,提高远程传输的波特率则可能导致传输的误码率较高,重传反而增加了远程传输的时间,因此,远程更新不宜采用过高的波特率。

5结束语

以BootLoader程序建立IAP环境将给开发带

来很大的好处。首先,是开发环境被简化成了“PC+RS232电缆+目标板”

,其次是在工程应用中大大简化了程序更新的工作量。因此,在RTU的研发生产过程中,BootLoader技术将会得到更为广泛的应用。

参考文献

[1]AVR911:AVROpen-SourceProgrammer,2004.[2]AVR910:InSystemProgramming,2000.[3]AtmelCorp.ATMega128Datasheet2005.

[4]

马潮,詹卫前,耿德根.ATMega8原理及应用手册[M].北京:清华大学出版社,2003.

(上接第62页)

相关文档