yanrz 发表于 2008-5-15 23:28:06

请教马老师,关于can128的twi中断编译出现的错误提示问题!

在编辑中只要使用了#pragma interrupt_handler TWI_isr:iv_TWI就会出现以下错误,请问是怎么回事?
我用的是iccavr6.31a,芯片选择atmega128/can128
!E debug.o(79): Code address 0x8e already contains a value
!E debug.o(79): Code address 0x8f already contains a value
!E debug.o(81): Code address 0x8c already contains a value
!E debug.o(93): Code address 0x8c already contains a value
以下是源程序

#include <ioCAN128v.h>
#include <macros.h>

unsigned char T0=0;
// 延时子程序
void delay (int time)//0.25*(7*ticks+18)us for 4MHz
{
while(time--)WDR();//喂狗;
}

//定时器1初始化
void InitT1(void)
{
TCCR1A=0x00;
TCCR1B=0x03;//set T1's clock=CK/64,8uS 4MHz
//1,2,3,4,5分别为1,8,64,256,1024分频6,7由T0引入,下降沿/上升沿触发
TIMSK1|=(1<<TOIE1);//T1中断使能
TCNT1=64285;//加1250则溢出
}

#pragma interrupt_handler TWI_isr:iv_TWI
void TWI_isr(void)
{
WDR();
}

//T1中断
#pragma interrupt_handler T1IntServer:iv_TIMER1_OVF
void T1IntServer(void)//0.01s%0
{
TCNT1=64285;//加1250则溢出
T0++;//定时器T0计时器,用于闪灯时间定时
}

//初始化硬件子程序
void InitDevicd(void)
{
DDRD=0XFF;
   
}

//运行处理程序
void RunProcess(void)
{
if(T0>50)//0.5s后变换输出
{
   T0=0;//定时器T0计时器,用于闪灯时间定时
         DDRD^=0XFF;
}
}

//主函数
void main(void)
{
InitDevicd();//初始化硬件子程序
InitT1();//初始化定时器1
WDTCR=0x1f; //看门狗定时器为2048K周期(每周期为1uS),共2.1s
SEI();//enable interrupts=> enable UART interrupts
while(1)
{
    RunProcess();//运行处理程序
}
}

machao 发表于 2008-5-16 16:21:04

!E debug.o(79): Code address 0x8e already contains a value
!E debug.o(79): Code address 0x8f already contains a value
!E debug.o(81): Code address 0x8c already contains a value
!E debug.o(93): Code address 0x8c already contains a value

这里不是有提示的吗?

yanrz 发表于 2008-5-16 21:55:30

但是这个地方究竟是什么东西占据了呢?
如果我把这个中断去掉就不会了。

Gorgon_Meducer 发表于 2008-5-17 11:26:06

你用的是ICC吧?
首先,你确认你的版本已经破解了。(你的问题可能不在这里)
其次,确认你在Compiler Option里面选择了正确的芯片型号。

machao 发表于 2008-5-17 19:20:21

79,81,93处是什么语句?

Gorgon_Meducer 发表于 2008-5-17 20:18:56

马老师的问题提醒了我,好像你的错误提示,不是成串而连续的。——姜还是老的辣哈
我也想知道“9,81,93处是什么语句? ”

machao 发表于 2008-5-17 20:36:17

作者自己删除掉.

yanrz 发表于 2008-5-17 23:13:43

其实我也很想知道究竟里面是什么东西,但是不知道在debug.o里面怎么看,没研究过

yanrz 发表于 2008-5-17 23:27:57

现在的程序已经最简,芯片选择atmega128/can128,其余的都是默认的,编译时还是出现以下错误,不知道究竟是什么东西占据了这个区域。我以为你们研究毕竟深入,所以提问,谢谢回答。
以下是我的程序,希望碰到过的朋友知会一下,非常感谢!
其实在can128中不止是TWI中断会出现类似的错误,还有最后几个中断都是这样,只要将下面的中断向量更改就会出现类似的错误。

#include <ioCAN128v.h>
#include <macros.h>

#pragma interrupt_handler TWI_isr:iv_TWI
void TWI_isr(void)
{
WDR();
}

//主函数
void main(void)
{
DDRD=0XFF;
SEI();//
while(1)
{
    ;
}
}

machao 发表于 2008-5-18 02:37:01

正好我的系统中也有ICC6.31a,所以帮你试了一下.问题确实存在,应该是ICC 6.31.A的BUG.ICC最新版为7.x的.

测试下来,是CAN128的中断36,37出问题.问题是M128本身中断到35.34是TWI中断.而M128CAN比M128多了两个中断:36(TWI)和37.

但编译系统还是按M128生成代码,在35号中断向量后面的FLASH中,从0X8C开始放入初始化代码.

而M128CAN的36号中断向量为 8C 8D 8E 8F,37号中断向量为 90 91 92 93.所以当你使用中断36和37时,编译报错,说8C 8D 8E 8F处已经有代码了.

帮你查了ICC的更新日志:

V7.00C - May 3rd, 2005
Under some conditions, the command line compiler was not licensed.
IDE
    - network dongle DLL was incorrect
    - starting address for CAN128 was incorrect   =============================>>这里!!
Compiler
    - obscure register allocation bug may cause some programs to fail
    - When generating ISR save/restore sequence, the compiler was incorrectly
      not save/restore R0/R1 some times for reading flash 16 bit variables
      for enhanced mode targets (e.g. M128 and other newer Megas).

可见,在ICC的7.00C版,修正了这个错误.

解决方案:
1.使用更新版的ICC
2.如果不使用CAN的功能,换M128
3.换个编译系统,如CVAVR,iar等.如我现在使用的CVAVR1.25.8支持AT90CAN128.

另外,你这种情况同上面6楼我讲的有区别,抱歉了.

yanrz 发表于 2008-5-18 17:33:40

非常感谢马潮老师,我其实也在网上查到了类似的东西,就是不知道如何修正,以为是可以将就用的,看来这回是非换编译环境不可了!

machao 发表于 2008-5-18 17:42:32

如果系统中不使用36,37中断,可以将就使用.

yanrz 发表于 2008-5-18 22:36:50

其实我是在业余学习用的,现在买了片can128,想玩玩can,而且用了一片eeprom,想趁机一起用一下
我已经在网上找到了icc7的破解版软件,已经编译过去了
谢谢马老师!

Gorgon_Meducer 发表于 2008-5-21 13:36:54

一起跟着学习到了。can128没有用过……看了这个帖子,以后会更加注意了……
页: [1]
查看完整版本: 请教马老师,关于can128的twi中断编译出现的错误提示问题!