单片机成长之路(avr基础篇)- 003 AVR单片机的BOOT区
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基础篇)- 003 AVR单片机的BOOT区的更多相关文章
- 单片机成长之路(51基础篇) - 015 关于sdcc的多文件编译范例二
本文是续 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)编写的. 在实际的工作中,单片机的头文件和功能函数不可能同全部放在同一个文件夹下面,我们把单片机成长之路(51基础 ...
- 单片机成长之路(51基础篇) - 009 关于sdcc的多文件编译范例(一)
本文是续 单片机成长之路(51基础篇) - 006 在Linux下搭建51单片机的开发烧写环境编写的. 本范例主要由(main.c ,delay.h,delay.c,makefile)4个文件组成,s ...
- (转)Python成长之路【第九篇】:Python基础之面向对象
一.三大编程范式 正本清源一:有人说,函数式编程就是用函数编程-->错误1 编程范式即编程的方法论,标识一种编程风格 大家学习了基本的Python语法后,大家就可以写Python代码了,然后每个 ...
- 单片机成长之路(avr基础篇)- 001 ISP与IAP的区别
ISP(In-System Programming)在系统可编程,指电路板上的空白器件可以编程写入最终用户代码, 而不需要从电路板上取下器件,已经编程的器件也可以用ISP方式擦除或再编程.IAP(In ...
- 单片机成长之路(51基础篇) - 004 STC89C52MCU 软件实现系统复位
用户应用程序在运行过程中,有时会有特殊需求,需要实现单片机系统复位(热启动之一),传统的8051单片机由于硬件上未支持此功能,用户必须用软件模拟实现,实现起来较麻烦.STC单片机增加了相应的硬件功能, ...
- 单片机成长之路(51基础篇) - 002 STC单片机冷启动和复位有什么区别
STC单片机简介 STC单片机是一款增强型51单片机,完全兼容MCS-51,还增加了新的功能,比如新增两级中断优先级,多一个外中断,内置EEPROM,硬件看门狗,具有掉电模式,512B内存等.还支持I ...
- python成长之路第三篇(1)_初识函数
目录: 函数 为什么要使用函数 什么是函数 函数的返回值 文档化函数 函数传参数 文件操作(二) 1.文件操作的步骤 2.文件的内置方法 函数: 一.为什么要使用函数 在日常写代码中,我们会发现有很多 ...
- Sass进阶之路,之一(基础篇)
Sass 学习Sass之前,应该要知道css预处理器这个东西,css预处理器是什么呢? Css预处理器定义了一种新的语言将Css作为目标生成文件,然后开发者就只要使用这种语言进行编码工作了.预处理器通 ...
- C++自学成长之路(第一篇)
今天开始我将开启C++自学成长之路,今天是第一天,在以前就一直在网上查找关于c++的资料,想买一本好一点的,权威一点的资料书,通过努力查找,我选择了c++ primer,在网上这本书的好评如潮.更多的 ...
随机推荐
- miniui中可以设置是否让页面进行分页 <div id="datagrid1" class="mini-datagrid" style="width:100%" allowAlternating="true" showpager="true"/> 就是设置showpager属性为true
<div id="datagrid1" class="mini-datagrid" style="width:100%" allowA ...
- Java中菜单的实现以及画实线与画虚线之间的自由转化
1.Java画线 1 import java.awt.Color; import java.awt.Container; import java.awt.Graphics; import java.a ...
- 错误 在类中找不到main方法请将main方法定义为 public static void main String args否则JavaFX应用程序类必须扩展javafx-ap
最近在使用eclipse编写java程序时遇到这样一个问题: 错误在类中找不到main方法,请将main方法定义为 public static void main(String[] args)否则 J ...
- 【基础】链表的储存结构说明(python)
[实现链表的添加] class aNode(): def __init__(self,data=None,nxt=None): self.data=data self.nxt=nxt class ru ...
- spring_AOP_XML
例子下载 对于xml的AOP配置主要集中在配置文件中,所以只要设置好配置文件就行了 beans.xml <?xml version="1.0" encoding=" ...
- Redis基础、应用、第三方支持组件总结
这段时间一直在研究学习Redis的相关知识,现在大概做下总结吧首先,Redis的基础方面,不说配置,就单单说下Redis数据类型:Redis 五大数据类型有String 类型,Hash 类型,List ...
- MySQL Unable to convert MySQL datetime value to System.DateTime 解决方案
Unable to convert MySQL date/time value to System.DateTime 解决方案 这个问题发生在MySQL数据里面有Date类型数据,在C#中查询出来时候 ...
- async函数
async函数的实现原理,就是将Generator函数和自动执行器,包装在一个函数里.async函数返回Promise对象,async函数的return值是then方法的参数,await后跟Promi ...
- 01背包-dp
一 问题分析 二 代码实现 package Dp_0_1_bag; import java.io.BufferedWriter; import java.io.FileWriter; import j ...
- Vue子页面给父页面传递数据
子页面: <template> <div> <p>子组件</p> <button @click="sendMsg">传递 ...