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

2019-12-06来源: eefocus关键字: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. rem

[1] [2]
关键字:atmega128  bootloader  IAR-AVR下  linker文件  配置 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic482232.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:使用eclipse Arduino IDE开发 AVR程序
下一篇:osu键盘制作工作日志(基于avr-usb的两键无冲usb机械键盘)

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

avrstudio 5开发atmega128 _0
;  }     return 0; }备注:1.头文件:我们的头文件在我们安装的E:AtmelAVR Studio 5.0extensionsApplicationAVR Toolchainavrinclude 这个目录里面可一找到你要的东西,仔细看看里面的头文件,这里是我们开发atmegaavr要用到的头文件,要是你开发其他的文件你需要包含不同类型的头文件,具体的全部在extension这个目录,可以自己仔细研究下,一般的情况不生产hex文件,需要自己设置.2.生成hex文件在你的菜单的project里面有一编辑你项目属性的选项,点击这选项在弹出的对话框的最左
发表于 2020-01-08
avrstudio 5开发atmega128 _0
codeblocks+winavr开发avr单片机(atmega16)
; was available so I chose that.A wizard starts with the usual stuff in the first step: Project name, location etc.Second step: Select AVR processor, and I have a ATmega88 on the STK500 so I chose that. Here is also the setting of F_CPU, what files to generate and an option to run avr-size after build.Finish! I now
发表于 2020-01-03
codeblocks+winavr开发avr单片机(atmega16)
atmega48单片机特性 atmega48的低功耗设计
供电时,未使能内部看门狗的情况下,atmega48的典型掉电电流小于1ua。具体工作电流见图1。而且该单片机在1.8v~5.5v的电压范围内均能正常工作,片内自带4k字节的flash、256字节的e2prom,以及512字节sram;并内置6~8路10位ad转换器、看门狗、3个16位的定时/计数器、具有独立振荡器的实时计数器rtc 和6路PWM输出。另外还具有五种休眠模式,引脚变化及中断可唤醒mcu。图1 工作电流与系统频率的关系 图2工作电流与供电电压的关系(128k)低功耗设计方法以单片机为核心构成的系统,其系统的总能耗是由单片机能耗及其外围电路能耗共同构成。为了降低整个系统的功耗,除了要降低单片机自身的运行功耗外,还要降低
发表于 2019-12-27
atmega48单片机特性 atmega48的低功耗设计
基于ATmega8单片机多功能实验仪设计解决方案
由于嵌入式系统应用技术的不断发展,对于核心处理器性能的要求越来越高,一些传统的51系列控制芯片已经难以胜任许多复杂的任务。因此,我们通过调研分析,自行开发了一套基于ATmega8高性能系列单片机的实验开发系统。ATMEL公司的ATmegs8单片机是一种具有独特结构的8-bit RISC CPU,其在线自编程Flash和单时钟指令,为C语言、Basic语言优化的指令系统设置,以及丰富的片载外围接口电路,使功能强大的ATmegs8单片机成为一款高度灵活和高性价比的芯片,为许多高端嵌入式系统设计提供了优秀的解决方案。1 系统总体设计单片机多功能实验仪硬件的总体设计原理框图如图l所示:单片机实验开发应用系统中ATmega8 MCU核心模块
发表于 2019-12-26
基于ATmega8单片机多功能实验仪设计解决方案
ATMEGA16单片机I0端口的使用方法解析
一、ATMEGA16的I端口的使用:(只有一个实验,下面的部分每个小节可能有几个实验验证,你懂得)一—(01)、)—使用4*4行列式按键开关的使用I/O端口介绍:直接一个图就哦了,因为根本没什么,就是控制寄存器(这里一定要注意,后面的ATmega16的引脚的功能都是控制寄存器来实现引脚或者器件的功能的,说白了,知道了寄存器,会用了寄存器,再来点51的基础,那这些东西真的就没什么了,AVR单片机很简单的)我用的就是IAR和Proteus好了先给个图,这个是按照手机上的设计的你看了就懂了别的就不费话了,一看图不就全明白了然后就是今天的代码其实相当的简单,和51的原理一样,然后就是控制引脚的输入输出,高低电平,这里用不到高阻态
发表于 2019-12-26
ATMEGA16单片机I0端口的使用方法解析
AVR单片机读写CPLD程序实例(ATmega128程序案例)
项目中需要使用CPLD完成一部分算法设计,参数由AVR给出,因此需要完成AVR和CPLD的通信。因此写了一个测试程序。CPLD挂在AVR的数据和地址总线上,AVR使用ATmega128,在CPLD中设置几个寄存器,通过AVR读写寄存器来实现两者之间的通信。Mega128的外部存储空间从0X1100开始,因此只需要配置相应的寄存器后读取或者写入相应的地址就可以,程序比较简单,注释中都有说明,仅供参考。/******************************************************************* 名称:mian.c 功能:测试AVR与CPLD的通信,将数据写入CPLD中配置
发表于 2019-12-26
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved