BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器。对于通常的FLASH存储器,数据的写入须要必定的时间来完成,在数据写入完成以前,存储器中全部的数据都是不可读的,这就在运行旧程序和写入新程序之间形成了一个矛盾。编程
使用BOOT区是解决这个矛盾的方法之一,它将FLASH存储器从物理上分为两个独立的区域,对其中的一个区的数据写入不会影响到另外一个区的数据读取操做。咱们可让单片机的程序在其中一个区(一般是BOOT区)运行,而运行着的程序代码写入另一个区(一般为应用程序区)内。安全
AVR高档单片机ATmega系列中含有BOOT代码区,即程序引导区,也可称器件自身监控区,有了此BOOT区监控,该器件就可对本身器件的Flash程序存储器及EEPROM数据存储器进行读、写操做,即实现自编程功能,也可称IAP在系统应用中编程,这种自编程程序区咱们称其用户管理程序,简称用户程序。网络
BOOT区大小可根据实际须要用寄存器设定,并可锁定加密,使外界没法读取其监控。若是BOOT区监控设计得好,可把该器件的主要、关键控制对象放在BOOT区监控内(如中断控制),其它工做让用户本身设计,可变成傻瓜式控制器、检测仪,可远程对嵌入式设备进行检测、维护、升级等操做。也可经过有线、无线网络监控设备。实现秀才不出门,也可管世界。这种带BOOT区监控的AVR器件,可应用于程序、数据需变更的场合;可用于自适应、自修正场合;可用于闭环控制,人工智能; 可用于统一计量、计价,又必须在同一时间内快速调正的设备中(例:IC卡计费电话机); 可用于……
有了BOOT区监控,用户程序可经过单片机通信口与PC机RS232接口来写用户程序,可省去AVR串行或并行下载电缆,这对外出维护设备带来方便。双龙SL-MEGA8开发实验器出厂就提供BOOT区演示监控,用标准RS232通信电缆就可作程序下载实验(对Flash程序存储器及EEPROM数据存储器实验擦、写、读取)。这样对有的AVR高档单片机编程方法有:编程器编程,ISP串行、并行下载编程,JTGA线编程,IAP在应用中编程(仅用串行通信线)多种形式,给科研、生产带来方便。能够本身设计编程器件,对用户将提供BOOT区监控方案框架,你只需简单链接,就可组成本身的BOOT区监控。以上设计思想也适合全部AVR高档单片机ATmega系列中含带有BOOT代码区的器件。框架
AVR的BOOTLOAD功能同其它一些芯片不一样,它的BOOTLOAD程序没有固化在芯片内部(出厂为空),而是须要由用户设计实现(实际上,你第一次下载BOOTLOAD程序还必须使用其它的方式编程,如ISP、JTAG等),所以对通常的用户掌握起来有必定的困难,不如一些其它芯片的BOOTLOAD使用方便。但对高手来说,能够根据实际须要编写高级、高效、专用的BOOTLOAD程序,如从一个U盘读取数据,更新用户的应用程序;编写一个时间炸弹,或对用户的密码进行验证,10次不对则将系统程序销毁等等。简单意味着使用方便,但灵活和适应性差,而灵活性须要你具有更高的能力去驾驭它。可能会有一天,在单片机的系统上也出现了“病毒”程序,其缘由就是使用了固化的BOOTLOAD程序。因为固化的程序必须有统一开放的接口,那么用一个带“病毒”的应用程序更新原来的应用程序也就垂手可得了。函数
相关问题的总结:测试
1.AVR自编程是如何实现的?
答:要想回答这个问题必须先了解AVR的FLASH的分区结构:AVR单片机FLASH分红RWW(READ-WHILE-WRITE)和NRWW(NO-READ-WHILE-WRITE)两个区;其中RWW区的含义是:若是Boot Loader 软件是对RWW 区内的某一页进行编程,则能够从Flash 中读取代码,但只限于NRWW 区内的代码。在Flash 编程期间,用户软件必须保证没有对RWW 区的读访问。若是用户软件在编程过程当中试图读取位于RWW 区的代码( 如经过call/jmp/lpm指令或中断),软件可能会终止于一个未知状态。为了不这种状况的发生,须要禁止中断或将其转移到Boot Loader 区。Boot Loader 老是位于NRWW 存储区。只要 RWW 区处于不能读访问的状态,存储程序存储器控制和状态寄存器(SPMCSR) 的RWW 区忙标志位RWWSB 置位。编程结束后,要在读取位于RWW 区的代码以前经过软件清除RWWSB。而NRWW区的含义是:在Boot Loader 软件更新RWW 区的某一页时,能够读取位于NRWW 区的代码。当 BootLoader 代码更新NRWW 区时,在整个页擦除或写操做过程当中CPU 被挂起。并且AVR还自带读写程序区的指令(LPM读程序区指令,SPM写程序区指令),实现程序的更新操做。
================================================================================
2.可否在进行自编过程当中,修改复位中断向量的位置(从APP区移至BOOTLOADER区或者相反)?
答:不能。咱们通常经过编程Boot复位熔丝位使得复位向量指向Boot 区的起始地址。这样,复位后BOOT Loader 当即就启动了。加载了应用代码后,程序再开始执行应用代码。但,有一点必须指出的是,MCU 自己不能改变熔丝位的设置。也就是说,一旦Boot 复位熔丝位被编程,复位向量将一直指向Boot 区的起始地址。熔丝位只能经过串行或并行编程的方法来改变。故,在自编程过程当中,没法实现修改复位中断向量的位置。
================================================================================
3.如何将一个函数定义在BOOT区呢?
答:首先对函数进行链接编译声明,再先修改MAKEFILE里链接编译的相关选项如M16里想将GETCHAR(VOID)定位在BOOT区里则:
(1)声明GETCHAR(VOID __attribute__ ((section (".bootloader")));
(2)在"LDFLAGS=-Wl,-Map=$(TRG).map,--cref"行加进",--section=.bootloader=0x3800"声明便可
================================================================================
4.如何将整个工程链接编译的起始地址定义在BOOT区首地址
答:只需修改MAKEFILE里的TEXT段的值便可
如:"LDFLAGS=-Wl,-Map=$(TRG).map,--section-start=.text=0x3800"
================================================================================
5.在编译BOOTLOADER时设置引导程序的起始,为何与STUDIO显示的设置RWW区大小显示的不同如设置M16时会显示(Boot Flash size = 1024 words Boot start address=$1c00;[BOOTSZ=00]:default而在MAKEFILE里则是.startsection.bootsection=0x3800呢?
答:在STUDIO里是用字描述地址,而在GCC却用字节描述。
================================================================================
6.实现AVR的BOOTLOADER工做须要注意那些事项?
答:人工智能
(1)了解AVR的FLASH的结构分区的含义及APPLICATION;
(2)理解AVR GCC的BOOT.H库文件的例子,并进行测试;
(3)懂得利用AVR GCC的MAKFILE链接编译选项,修改函数或者程序的编译时重定位操做;
(4)进行简单仿真的测试;
(5)策划正确而安全的通信协议与上位机软件进行通信;加密