搜索
bottom↓
回复: 5

求教at91sam9g20工程在iar5.4下编译链接生成bin和hex的问题

[复制链接]

出0入0汤圆

发表于 2011-3-30 16:01:31 | 显示全部楼层 |阅读模式
编译官方的led灯例子生成hex文件的时候正常,只有4K左右。
但是如果选择生成bin文件的时候,文件在链接的时候bin文件疯涨至几百MB,查看bin文件发现文件后半部分全是0
各位看一下这是为什么啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2011-3-30 18:17:06 | 显示全部楼层
原因:
请查看sdram.icf文件就知道,如下:
define symbol __ICFEDIT_region_SDRAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_SDRAM_end__   = 0x21FFFFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x300000;
define symbol __ICFEDIT_region_RAM_end__     = 0x327FFF;
因为配置文件用0x300000~0x327FFF区域来保存文件放置中断向量跳转表,用0x20000000开始的区域保存用户程序,所以链接的话,会把0x300000开始到0x20000000之间的区域都链接进去,所以bin文件有几百MB

解决方法:
把程序的运行地址放到从0x20000000开始,然后在程序中,把中断微量表复制到0x300000地址处

出0入0汤圆

 楼主| 发表于 2011-3-30 22:29:03 | 显示全部楼层
感谢了,明天去试一试。
可是还有一点不明白,为什么编译生成的*.hex文件是正常大小呢?

出0入0汤圆

 楼主| 发表于 2011-3-31 10:17:22 | 显示全部楼层
已经解决 
/*initialize by copy { section .vectors };*/
initialize by copy { readwrite };

出0入0汤圆

 楼主| 发表于 2011-4-1 10:55:32 | 显示全部楼层
llf021421 马中马

还是不行,这个是配置的icf文件。

中断向量表是放在了0x200000的sram中,
启动运行代码及其它内容在0x20000000的sdram中,

为什么编译生成bin文件就很大,但是编译生成hex文件时正常大小呢?

/*###ICF### Section handled by ICF editor, don't touch! ****/
/*-Editor annotation file-*/
/* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */
/*-Memory Regions-*/
define symbol __ICFEDIT_region_SDRAM_start__ = 0x20000000;
define symbol __ICFEDIT_region_SDRAM_end__   = 0x23FFFFFF;
define symbol __ICFEDIT_region_RAM_start__   = 0x200000;
define symbol __ICFEDIT_region_RAM_end__     = 0x203FFF;
/*-Sizes-*/
define symbol __ICFEDIT_size_startup__  = 0x100;
define symbol __ICFEDIT_size_vectors__  = 0x100;
define symbol __ICFEDIT_size_cstack__   = 0x2000;
define symbol __ICFEDIT_size_sysstack__ = 0x60;
define symbol __ICFEDIT_size_irqstack__ = 0x60;
define symbol __ICFEDIT_size_heap__     = 0x0;
/*-Exports-*/
export symbol __ICFEDIT_region_SDRAM_start__;
export symbol __ICFEDIT_region_SDRAM_end__;
export symbol __ICFEDIT_region_RAM_start__;
export symbol __ICFEDIT_region_RAM_end__;
export symbol __ICFEDIT_size_startup__;
export symbol __ICFEDIT_size_vectors__;
export symbol __ICFEDIT_size_cstack__;
export symbol __ICFEDIT_size_sysstack__;
export symbol __ICFEDIT_size_irqstack__;
export symbol __ICFEDIT_size_heap__;
/**** End of ICF editor section. ###ICF###*/

define memory mem with size = 4G;
define region STA_region =   mem:[from __ICFEDIT_region_SDRAM_start__ size __ICFEDIT_size_startup__];
define region SDRAM_region = mem:[from __ICFEDIT_region_SDRAM_start__+__ICFEDIT_size_startup__ to __ICFEDIT_region_SDRAM_end__];
define region VEC_region =   mem:[from __ICFEDIT_region_RAM_start__ size __ICFEDIT_size_vectors__];
define region RAM_region =   mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM_end__];

define block CSTACK    with alignment = 8, size = __ICFEDIT_size_cstack__   { };
define block SYS_STACK with alignment = 8, size = __ICFEDIT_size_sysstack__ { };
define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { };
define block HEAP      with alignment = 8, size = __ICFEDIT_size_heap__     { };

initialize by copy { section .vectors };
do not initialize  { section .noinit };

place in STA_region { section .cstartup };
place in VEC_region { section .vectors };
place in SDRAM_region { readonly, readwrite, block IRQ_STACK, block SYS_STACK, block CSTACK, block HEAP };

出0入0汤圆

 楼主| 发表于 2011-4-1 14:40:43 | 显示全部楼层
不知道为什么,
重新下载了官方新的例子以后编译bin文件时可以的,icf文件完全相同啊。
留着以后慢慢查原因
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 01:22

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表