atmega128 bootloader程序在IAR-AVR下 linker文件的配置及原因

第一步:atmega128的片内flash分区描述
在atmega128 datasheet的275页中有分区描述

对应的在284页中,有具体的应用区与boot区的大小设置

注意:Byte address = word address * 2
这里的BOOT区首地址,$F000 = 0x1E000

根据手册中的描述,我们使用JTAG MKII 烧写器通过软件 Avr Studio 4,配置熔丝位 BOOTSZ为00

注意:这里面的4096 words = 8K bytes

第二步:说明一下linker(.xcl)文件的作用
好了,怎么让我们的程序烧写到flash中是在指定的0x1E000处呢?这就需要在link文件中指定CODE区的位置了。
适用于atmega128 bootloader程序的.xcl文件如下:

/*                      - lnkm128.xcl -
 *
 *   XLINK command file for the ICCAVR C-compiler using the --cpu=m128, -ms
 *   options. Segments are defined for an ATmega128 whithout external
 *   memory. It is also possible to "add" external SRAM, EPROM and EEPROM.
 *
 *   Usage: xlink your_file(s) -f lnkm128
 *
 *   File version:   $Name: $
 */

/*========================================================================*/
/* NOTE: This file has been modified to be used with the code example in: */
/*    AVR106: C functions for reading and writing to Flash memory         */
/* Se comments further down in this file, and the application note for    */
/* more information.                                                      */
/*========================================================================*/

/*====================================================*/
/*
 * Constants used down below,
 * Do not change these lines,
 * if it is not stated otherwise
 */

/* Code (flash) segments */
-D_..X_INTVEC_SIZE=8C   /* 4 bytes * 35 vectors */
-D_..X_FLASH_TEND=FF    /* End of tiny flash memory */
-D_..X_FLASH_NEND=FFFF  /* End of near flash memory */
-D_..X_FLASH_END=1FFFF  /* End of flash memory */

/* Internal data memory */

/*
 * Change the two lines below to 60(BASE) and FF(TEND)
 * if you are running in "mega103 mode"
 */
-D_..X_SRAM_BASE=100    /* Start of ram memory */
-D_..X_SRAM_TEND=100    /* End of tiny ram memory */

-D_..X_SRAM_END=10FF    /* End of ram memory */
/* Internal EEPROM */
-D_..X_EEPROM_END=FFF   /* End of eeprom memory */
/*====================================================*/

/*
 * Modify the lines below to alter the size of the RSTACK, CSTACK and HEAP
 * segments. These need to be fine tuned to suit your specific application.
 * The ‘_..X_‘ prefix is used by C-SPY as an indication that the label should
 * not be displayed in the dissassembly window.
 */

//-D_..X_CSTACK_SIZE=200  /* 512 bytes for auto variables and saved registers. */
//-D_..X_RSTACK_SIZE=40   /* 64 bytes for return addresses, equivalent to 32 */
                        /* levels of calls, including interrupts. */
//-D_..X_HEAP_SIZE=100    /* 256 bytes of heap. */

-D_..X_CSTACK_SIZE=300  /* 512 bytes for auto variables and saved registers. */
-D_..X_RSTACK_SIZE=40   /* 64 bytes for return addresses, equivalent to 32 */
                        /* levels of calls, including interrupts. */
-D_..X_HEAP_SIZE=100    /* 256 bytes of heap. */

/*
 * Modify these lines if you have an external SRAM connected to the system.
 *
 * Note: Remember to turn on the external data and address busses in
 *       __low_level_init if external memory is used.
 */
-D_..X_EXT_SRAM_BASE=_..X_SRAM_BASE
-D_..X_EXT_SRAM_END=_..X_SRAM_END

/*
 * Modify these lines if you have an external EPROM connected to the system.
 *
 * Note: Remember to turn on the external data and address busses in
 *       __low_level_init if external memory is used.
 */
-D_..X_EXT_EPROM_BASE=_..X_SRAM_BASE
-D_..X_EXT_EPROM_END=_..X_SRAM_END

/*
 * Modify these lines if you have an external EEPROM connected to the system.
 *
 * Note: Remember to turn on the external data and address busses in
 *       __low_level_init if external memory is used.
 */
-D_..X_EXT_EEPROM_BASE=_..X_SRAM_BASE
-D_..X_EXT_EEPROM_END=_..X_SRAM_END

/*
 * The following segments are located in the internal memory of
 * the ATmega128. Do not change these lines.
 */

/* Define CPU */
-ca90

/*========================================================================*/
/* How to move the complete project and interrupt table to a Boot Sector. */
/*========================================================================*/
/* This method can be used on any device with boot sectors.               */
/* It presumes these defines are predefined:                              */
/*     _..X_INTVEC_SIZE, _..X_FLASH_TEND,                                 */
/*     _..X_FLASH_NEND, _..X_FLASH_END                                    */
/*========================================================================*/
/* -1- Find and remove (/comment out) the following section from the      */
/*     original XCL file.                                                 */
/*========================================================================*/

/* Code memory */
//-Z(CODE)INTVEC=0-(_..X_INTVEC_SIZE-1)

/* Fill unused interrupt vector‘s with RETI */
/*
-H1895
-h(CODE)0-_..X_INTVEC_SIZE

-Z(CODE)TINY_F=_..X_INTVEC_SIZE-_..X_FLASH_TEND
-Z(CODE)NEAR_F,SWITCH,DIFUNCT=_..X_INTVEC_SIZE-_..X_FLASH_NEND
-Z(CODE)CODE=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(FARCODE)FAR_F=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(CODE)HUGE_F,INITTAB=_..X_INTVEC_SIZE-_..X_FLASH_END
-Z(CODE)TINY_ID,NEAR_ID,CHECKSUM=_..X_INTVEC_SIZE-_..X_FLASH_END
*/

/*========================================================================*/
/* -2- Paste in the following section as a replacement.                   */
/* -3- Remove the comment marking on the used Boot Sector Size            */
/*========================================================================*/

/* Boot Sector Size */
-D_..X_BOOTSEC_SIZE=2000  /* 4096 words  */
//-D_..X_BOOTSEC_SIZE=1000  /* 2048 words */
//-D_..X_BOOTSEC_SIZE= 800  /* 1024 words */
//-D_..X_BOOTSEC_SIZE= 400  /*  512 words */
//-D_..X_BOOTSEC_SIZE= 200  /*  256 words */
//-D_..X_BOOTSEC_SIZE= 100  /*  128 words */
-D_..X_DEFSEC_POS=1000

/* Code memory */
-Z(CODE)INTVEC=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE)
-Z(CODE)DEFSEC=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1+_..X_DEFSEC_POS)-_..X_FLASH_END

/* Fill unused interrupt vector‘s with RETI */
-H1895
-h(CODE)(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE) 

/*========================================================================*/
/* -4- If the flash size is 32kB or less then;                            */
/*     - Remove the comment marking on following line:                    */
/*========================================================================*/

//-Z(CODE)NEAR_F,SWITCH,DIFUNCT=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE+1)-_..X_FLASH_NEND

/*========================================================================*/
/* -5- If the flash size is 32kB or less then;                            */
/*     - Remove the SWITCH segment from the following line:               */
/*========================================================================*/

-Z(CODE)CODE,SWITCH=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE+1)-_..X_FLASH_END

-Z(FARCODE)FAR_F=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE+1)-_..X_FLASH_END
-Z(CODE)HUGE_F,INITTAB=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE+1)-_..X_FLASH_END
-Z(CODE)TINY_ID,NEAR_ID,CHECKSUM=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE+1)-_..X_FLASH_END

/*========================================================================*/
/*========================================================================*/

/* Internal data memory */
-Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_BASE-_..X_SRAM_TEND
-Z(DATA)NEAR_I,NEAR_Z=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END

/*
 * If external SRAM is available it is possible to place the stacks there.
 * However, the external memory is slower than the internal so moving the
 * stacks to the external memory will degrade the system performance.
 */
-Z(DATA)RSTACK+_..X_RSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */
-Z(DATA)CSTACK+_..X_CSTACK_SIZE=_..X_SRAM_BASE-_..X_SRAM_END /* ,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END */

/*
 * If external SRAM is available it might be a good idea to move the
 * heap segment there, i.e. remove the _..X_SRAM_BASE-_..X_SRAM_END range.
 */
-Z(DATA)HEAP+_..X_HEAP_SIZE=_..X_SRAM_BASE-_..X_SRAM_END,_..X_EXT_SRAM_BASE-_..X_EXT_SRAM_END

/* Internal eeprom memory */
-Z(XDATA)EEPROM_I,EEPROM_N=0-_..X_EEPROM_END

/*
 * The following segment definitions are only used if external memory is
 * connected to the AVR controller.
 */

/* External EPROM */
-Z(CONST)NEAR_C=_..X_EXT_EPROM_BASE-_..X_EXT_EPROM_END

/* External EEPROM */
-Z(DATA)NEAR_N=_..X_EXT_EEPROM_BASE-_..X_EXT_EEPROM_END

/* Select reduced "printf" support to reduce library size.
   See configuration section in manual concerning printf/sprintf. */

/*Dlib*/
-e_Printf_1=_Printf

/*Clib*/
-e_small_write=_formatted_write
-e_small_write_P=_formatted_write_P

/* Disable floating-point support in "scanf" to reduce library size.
   See configuration section in manual concerning scanf/sscanf */

/*Dlib*/
-e_Scanf_1=_Scanf

/*Clib*/
-e_medium_read=_formatted_read
-e_medium_read_P=_formatted_read_P

/* Suppress one warning which is not relevant for this processor */
-w29

/* Code will now reside in file aout.a90 or aout.d90, unless -o is specified */
/* .d90 is the default if debug system is linked (option -r) */
/* .a90 is the default without debugging. Default format is -Fmotorola */

其中

-D_..X_BOOTSEC_SIZE=2000  /* 4096 words  */

确定了BOOT区的大小为4096字,与我们设置的BOOTSZ = 00正好吻合。
然后

-Z(CODE)INTVEC=(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE)
-h(CODE)(_..X_FLASH_END-_..X_BOOTSEC_SIZE+1)-(_..X_FLASH_END-_..X_BOOTSEC_SIZE+_..X_INTVEC_SIZE)

表示中断向量区的范围从0x1E000 ~ 0x1E08B,并将其填充

具体参数项,可以参考AVR的帮助文档 Linker and library Tools reference guide.

参考:ATMEL的官方应用文档的AVR106号应用笔记
http://www.atmel.com/dyn/products/app_notes.asp?family_id=607

第三步:bootloader程序,linker文件加载
1)将以上代码保存为lnkm128.xcl,并放于工程目录下
2)通过配置工程 Linker->Config->Override default将该文件加载进来

第四步:验证生成的hex文件是否将代码编译到了片内flash的0x1E000地址处

021000  -> 确定偏移段地址为0x1000
10E000  -> 确定段内地址从 0xE000开始
经计算实际地址为 0x10000 + 0xE000 = 0x1E000

时间: 2024-10-19 00:14:29

atmega128 bootloader程序在IAR-AVR下 linker文件的配置及原因的相关文章

linux下rsync文件同步配置详解

介绍 rsync(remote sync)是unix及类unix平台下的数据镜像备份软件,它不像FTP那样需要全备份,rsync可以根据数据的变化进行差异备份,从而减少数据流量,提高工作效率 rsync主要分为三个配置文件,分别是rsyncd.conf(主配置文件),rsyncd.secrets(密码文件),rsyncd.motd(服务器信息文件) ? 环境 centos7 IP:192.168.10.130?? 作为rsync服务器 centos7 IP:192.168.10.132? 作为r

Python---进阶---文件操作---获取文件夹下所有文件的数量和大小

一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前的文件夹 - 获取到当前文件夹下面所有的文件 - 处理我们当前的文件夹下面可能有文件夹的情况(也打印出来) - 做出统计 ------------------------------------- import os #获取到当前文件夹下面所有的文件all_files = os.listdir(os.curdir) #os.curdir 表示当前目录 curdir:currentdirectory type

Qt4程序在windows平台下打包发布

一.打包成绿色版 将源码编译成release版,运行*.exe文件,提示缺少*.dll,在Qt安装目录中找到相应的dll文件(一般在bin目录下),将dll文件复制到exe文件目录下即可. 二.打包成安装版 1.首先安装NSIS软件,NSIS菜单--编译工具--HW VNISEdit 2.上图中选择文件--新建脚本:向导--下一步 3.上图中名称填写*.exe文件名:软件版本.出版人.网站根据实际需要填写(若没有,则保留空白即可):程序标志会在安装界面的底部显示(若不需要也可选择不显示文本).设

将python的程序包装成windows下的service

使用python编写的脚本应用程序,在运行的时候需要有python的运行环境,但是我们肯定是希望整个python程序能够像应用程序一样打包生成一个包括其运行环境的exe文件包,这是第一步,但是要想使用net start这样的方式启动, 还需要将该exe注册到服务里面去,使用exe install完成. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 #SmallestService.py 

黑马程序员_Java IO(下)

1,字符编码 在Java程序的开发中最常见的是ISO8859-1,GBK/GBK2312,unicode,UTF编码. ISO8859-1:属于单字节编码,最多只能表示0-255的字符范围,主要在英文上应用. GBK/GB2312:中文的国际编码,专门用来表示汉字,是双字节编码,如果在此编码中出现中文,则使用ISO8859-1编码,GBK可以表示简体中文和繁体中文,而GB2312只能表示简体中文,GBK兼容GB2312 unicode:Java中使用此编码方式,是最标准的一种编码,使用十六进制进

VS2008运行MFC程序,提示microsoft incremental linker已停止工作解决方法

其实这边是因为设置有问题,具体的解决方案如下: 第一步:点击项目->"你的文件"属性->配置属性->链接器->启用增量链接   将  是(/INCREMENTAL)改为 否(/INCREMENTAL:NO) 第二步:点击项目->"你的文件"属性->配置属性->C/C++  将调试信息格式改为程序数据库(/Zi) 改完之后,重新调试一下程序,是不是问题已经解决了? 以下附上截图: VS2008运行MFC程序,提示microso

方法阻塞,方法一直阻塞,意味着这个程序卡在这里,一直不向下运行。知道这个阻塞方法执行完毕,有返回值。程序才继续向下执行

方法阻塞,方法一直阻塞,意味着这个程序卡在这里,一直不向下运行.知道这个阻塞方法执行完毕,有返回值.程序才继续向下执行. while (true) { // 当注册事件到达时,方法返回,否则该方法会一直阻塞 selector.select();  //这里将一直阻塞,程序不会向下执行.直到这个方法执行完,有返回值后 2.// 采用轮询的方式监听selector上是否有需要处理的事件,如果有,则进行处理 NIO SERVER NIO SERVERpackage com.anders.selecto

VS2013编写的C#程序,在xp下会报错说“不是合法的win32程序”。

VS2013编写的程序,在xp下会报错说“不是合法的win32程序”. 这个用C++编写的程序可以经过设置后在XP下运行,主要的“平台工具集”里修改就可以.方法见: http://blog.csdn.net/civilman/article/details/40109685 但是,用C#编写的程序,项目属性里是没有“平台工具集”的选项的,运行时会报错说不是正常的win32程序. DotNet版本为2.0,在xp下已经安装dotnet20. 请问,有谁知道如何让VS2013编写的C#程序在XP下运

黑马程序员---工具类---OC自定义函数---计算当前路径下所有文件的总行数

------iOS培训.Java培训.Android培训, iOS学习型技术博客,期待与您交流------ 计算当前路径下所有文件的总行数 /* 计算当前路径下所有文件的总行数 涉及到NSArray.NSString.NSFileManager */ // 计算当前全路径(文件\文件夹)下所有文件的行数 // 接收参数path:文件的全路径(文件.文件夹) NSUInteger codeLinesCount(NSString *path) { // 1.获得文件管理者    单例模式:整个程序的