sky5611 发表于 2010-4-7 17:35:03

请教:程序绝对地址定位

一旦使用#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

sky5611 发表于 2010-4-7 17:52:53

补充一点:
pragma abs_address: 0x1000
所用冒号肯定是西文的。

程序绝对地址定位究竟该怎么做?都有哪些注意事项?

论坛中可查出,出现此类问题的原因均为器件选择、冒号等,这些问题我已经注意到了,还会有别的原因吗?
诸位高手帮忙了,先谢了!

Gorgon_Meducer 发表于 2010-4-8 10:03:27

很明显啊,你绝对定位的那个位置,有其他代码了。ICC不会帮你自动挪的。

sky5611 发表于 2010-4-8 11:27:26

回复【2楼】Gorgon Meducer 傻孩子

很荣幸得到你的答复,谢谢!
但是问题还没有解决,希望得到继续的指导。

这个程序中,仅有此一处使用了程序绝对定位,其他都没有绝对定位,会和谁冲突呢?为什么0x1000会有其他代码呢?
况且换一个地址,pragma abs_address: 0x500,依然如此。提示Code address 0x500 already contains a value

这个问题怎么解决?请教了。

aaa1982 发表于 2010-4-8 16:34:37

你把绝对地址往大了写吧,

虽然就有一个绝对定位,但是还要放你的代码呀。



本来应该放代码的地方让你干别的了,就会有问题了。

sky5611 发表于 2010-4-8 21:50:25

回复【2楼】Gorgon Meducer 傻孩子
很明显啊,你绝对定位的那个位置,有其他代码了。ICC不会帮你自动挪的。
-----------------------------------------------------------------------

我本来以为ICC是会自动把其他代码挪开的。

请教:
我怎么知道哪里没有其他代码呢?我应该在哪里定位呢?假如我必须在0X1000定位,该怎么办?

sky5611 发表于 2010-4-8 22:01:03

回复【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 。我该怎么办?
请解释详细一点,我比较愚笨。

aaa1982 发表于 2010-4-8 22:37:07

你的程序有几十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

跟你程序中把代码放到哪里没关系哈。

Gorgon_Meducer 发表于 2010-4-9 08:56:57

to 【5楼】 sky5611
    首先,把绝对定位去掉。然后编译。成功以后,用AVR Studio仿真(软件仿真就可以),
进入仿真界面以后,切换到汇编视图,找一个空白的地方,记录下地址……

sky5611 发表于 2010-4-10 01:14:31

回复【7楼】aaa1982
-----------------------------------------------------------------------
回复【8楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

得到二位指教,问题顺利解决./emotion/em011.gif
感谢二位!感谢论坛!非常感谢!!

jackhong 发表于 2010-6-23 16:04:26

回复【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,请问这个是什么意思?这个好像和本问题应该是有关系的吧~~

Gorgon_Meducer 发表于 2010-6-24 12:43:24

已经回复你的邮件,请查收。

Bobb 发表于 2011-11-16 16:23:31

mark
页: [1]
查看完整版本: 请教:程序绝对地址定位