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)策划正确而安全的通讯协议与上位机软件进行通讯;

AVR单片机的BOOT区的更多相关文章

  1. 单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区

    BOOT区的由来基于一个简单的道理,即单片机的程序是保存在FLASH中的,要运行程序就必须不停的访问FLASH存储器.对于一般的FLASH存储器,数据的写入需要一定的时间来完成,在数据写入完成之前,存 ...

  2. 51,PIC,AVR单片机它们的优点缺点都有哪些?

    我有幸接触了几款单片机,并用它们做了一些项目.现在想做个小总结,谈一下自己用各种单片机的感受.仅是个人意见,仁者见仁智者见智. 传统51,我想我就不多说了,适合菜鸟入门,容易上手,价格一般(从性价比方 ...

  3. linux下avr单片机开发:中断服务程序

    不管是什么单片机程序,中断总是非常重要的一部分 ,linux 下的avr开发,主要是依靠avr-gcc,以及avr-libc,它们对中断程序的格式要求,与window下的icc-avr以及win-av ...

  4. AVR单片机RC触摸

    RC电容触摸感应按键1:RC感应原理 RC采样原理就是通过测量感应极电容的微小变化,来感知人体对电容式感应器(按键.轮键或者滑条)的感应.电极电容(C)通过一个固定的电阻(R)周期性地充放电.(原文件 ...

  5. AVR单片机最小系统 基本硬件线路与分析

    单片机最小系统  单片机最小系统设计 AVR基本硬件线路设计与分析 (ATmega16功能小板) AVR DB-CORE Ver2.3 Atmega16开发板 本站商城提供本最小系统销售:99元 AV ...

  6. 打打基础,回头看看avr单片机的定时器、中断和PWM(转)

    以前小看了定时器,发现这东西还真的很讲究,那先复习复习吧. 先提提中断:我的理解就是cpu执行时,遇到中断——根据对应的中断源(硬件或软件)——pc定位中断入口地址,然后根据这里的函数指针——跳转到相 ...

  7. AVR单片机8位数码管显示的程序实现

    AVR单片机8位数码管显示的程序实现 转载:http://www.sohu.com/a/117255149_119709   2016-10-26 16:30 我们接着来完成 数码管的显示实验.现在我 ...

  8. AVR单片机教程——旋转编码器

    好久没写这个系列了.今天讲讲旋转编码器. 旋转编码器好像不是单片机玩家很常用的器件,但是我们的开发板上有,原因如下: 旋转编码器挺好用的.电位器能旋转的角度有限,旋转编码器可以无限圈旋转:旋转时不连续 ...

  9. AVR单片机教程——数码管

    先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低.这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存 ...

随机推荐

  1. HDU 2255 奔小康赚大钱 KM算法的简单解释

    KM算法一般用来寻找二分图的最优匹配. 步骤: 1.初始化可行标杆 2.对新加入的点用匈牙利算法进行判断 3.若无法加入新编,修改可行标杆 4.重复2.3操作直到找到相等子图的完全匹配. 各步骤简述: ...

  2. LA 4329 BIT 分治

    #include <cstdio> #include <queue> #include <cstring> #include <iostream> #i ...

  3. linux视频学习7(ssh, linux启动过程分析,加解压缩,java网络编程)

    回顾数据库mysql的备份和恢复: show databases; user spdb1; show tables; 在mysql/bin目录下 执行备份: ./mysqldump -u root - ...

  4. android执行外部命令、检测文件是否存在、自动检测U盘路径

    private final String UDiskFileName = "/2969_logo/bootfile.image"; private final String Loc ...

  5. Spark集群搭建中的问题

    参照<Spark实战高手之路>学习的,书籍电子版在51CTO网站 资料链接 Hadoop下载[链接](http://archive.apache.org/dist/hadoop/core/ ...

  6. Lucene add、updateDocument添加、更新与search查询(转)

    package com.lucene;   import java.io.IOException;   import org.apache.lucene.analysis.standard.Stand ...

  7. java 工作内存

    所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的.看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓 ...

  8. 转:loadrunner关联及web_reg_save_param方法浅析

    一.什么是关联 关联(correlation):脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,已变量的形式替换录制时的静态 ...

  9. $.ajax和$.post的区别(前者根据key-value/后者根据形参)

    post不需要给key-value形式: $("#btn").click(function(){ var url=basePath+"/emp/login"; ...

  10. git 管理多个私钥

    .ssh/config文件: host imspring hostname 182.92.153.2 IdentityFile ~/.ssh/id_rsa port 22