请教:程序绝对地址定位
一旦使用#pragma abs_address,编译就出现下面错误,头大了!说明:
1、project->options->target->device 已经选定MEGA32
2、使用的是ICCAVR6.31A
请教大虾究竟错在哪里??????????
//源程序
#include <iom32v.h>
#include <macros.h>
#include <eeprom.h>
#pragma abs_address: 0x1000
const unsigned char S1 = {0x00,0x33,0x55,0xAA};
const unsigned char S2 = {0x10,0x13,0x15,0x1A};
#pragma end_abs_address
//主程序
//。。。。。。。
//。。。。。。。
//函数
//。。。。。。。
//。。。。。。。
编译后出现的信息:
C:\icc\bin\imakew -f M32.mak
iccavr -o M32 -LC:\icc\lib\ -g -ucrtatmega.o -bfunc_lit:0x54.0x7800 -dram_end:0x85f -bdata:0x60.0x85f -dhwstk_size:32 -beeprom:1.1024 -fihx_coff -bmyarea:0x3C00.0x3FFF -S2 @M32.lk -llpatmega -lcatmega
!E hnjxy1.o(2332): Code address 0x1000 already contains a value
!E hnjxy1.o(2332): Code address 0x1001 already contains a value
!E hnjxy1.o(2356): Code address 0x1002 already contains a value
!E hnjxy1.o(2356): Code address 0x1003 already contains a value
!E hnjxy1.o(2356): Code address 0x1004 already contains a value
!E hnjxy1.o(2356): Code address 0x1005 already contains a value
!E hnjxy1.o(2356): Code address 0x1006 already contains a value
!E hnjxy1.o(2356): Code address 0x1007 already contains a value
C:\icc\bin\imakew.exe: Error code 1
Done: there are error(s). Exit code: 1 补充一点:
pragma abs_address: 0x1000
所用冒号肯定是西文的。
程序绝对地址定位究竟该怎么做?都有哪些注意事项?
论坛中可查出,出现此类问题的原因均为器件选择、冒号等,这些问题我已经注意到了,还会有别的原因吗?
诸位高手帮忙了,先谢了! 很明显啊,你绝对定位的那个位置,有其他代码了。ICC不会帮你自动挪的。 回复【2楼】Gorgon Meducer 傻孩子
很荣幸得到你的答复,谢谢!
但是问题还没有解决,希望得到继续的指导。
这个程序中,仅有此一处使用了程序绝对定位,其他都没有绝对定位,会和谁冲突呢?为什么0x1000会有其他代码呢?
况且换一个地址,pragma abs_address: 0x500,依然如此。提示Code address 0x500 already contains a value
这个问题怎么解决?请教了。 你把绝对地址往大了写吧,
虽然就有一个绝对定位,但是还要放你的代码呀。
本来应该放代码的地方让你干别的了,就会有问题了。 回复【2楼】Gorgon Meducer 傻孩子
很明显啊,你绝对定位的那个位置,有其他代码了。ICC不会帮你自动挪的。
-----------------------------------------------------------------------
我本来以为ICC是会自动把其他代码挪开的。
请教:
我怎么知道哪里没有其他代码呢?我应该在哪里定位呢?假如我必须在0X1000定位,该怎么办? 回复【4楼】aaa1982
你把绝对地址往大了写吧,
虽然就有一个绝对定位,但是还要放你的代码呀。
本来应该放代码的地方让你干别的了,就会有问题了。
-----------------------------------------------------------------------
我并没有刻意在定位的地址放置其他代码呀,程序是顺序写下去的,大约有十几K,我试着把:
#pragma abs_address: 0x1000
const unsigned char S1 = {0x00,0x33,0x55,0xAA};
const unsigned char S2 = {0x10,0x13,0x15,0x1A};
#pragma end_abs_address
我是简单地按手册来的。放在前边、后边,都不行,都是显示 already contains a value 。我该怎么办?
请解释详细一点,我比较愚笨。 你的程序有几十k,当然0x1000(4K)的地方要放你的程序了,你又把数据放在了那里,肯定要出问题呀。
要不然你把数据放到后面,要不然你定义一下你的程序别往0x1000放(这样比第一种方法麻烦)。
#pragma abs_address: 0x6000//放到24K的地方
const unsigned char S1 = {0x00,0x33,0x55,0xAA};
const unsigned char S2 = {0x10,0x13,0x15,0x1A};
#pragma end_abs_address
跟你程序中把代码放到哪里没关系哈。 to 【5楼】 sky5611
首先,把绝对定位去掉。然后编译。成功以后,用AVR Studio仿真(软件仿真就可以),
进入仿真界面以后,切换到汇编视图,找一个空白的地方,记录下地址…… 回复【7楼】aaa1982
-----------------------------------------------------------------------
回复【8楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
得到二位指教,问题顺利解决./emotion/em011.gif
感谢二位!感谢论坛!非常感谢!! 回复【2楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------
请教大虾:
小弟头一次使用mega128,无奈遇到论坛上广为解答的Code address 0x01 already contains a value问题,但是在芯片选择里面关于128有两个,一个是m128(CAN128),一个是m128(m103),请问我该选哪个?
PS:我试验了一下:
选CAN128程序完全下进去貌似不执行主函数,我把修改测试小灯亮暗的语句写I/O初始化那里就执行,写主函数里就没反应。。
选m103跑马灯程序执行成功(用的PB7),但只要一用定时器中断,就又出现Code address 0x15 already contains a value,实在是无语了,这个问题目前论坛上好像还没人解答过,望大虾指点!
PS2:我用的ICCAVR 6.31(V 7.0也有类似同样问题),另外想请问一下用ICCAVR向导生成的代码在PORTC初始化后边总有一个//m103 output only,请问这个是什么意思?这个好像和本问题应该是有关系的吧~~ 已经回复你的邮件,请查收。 mark
页:
[1]