caihong001 发表于 2012-10-26 17:47:43

有关AVR_GCC编译器的奇怪问题,肯求高人停下脚步看看!!!

最近写的一个程序出现一个很奇怪的问题,之前程序是在ICCAVR编译上做的,程序完好,没问题,后来我想转移到GCC上,就出问题了

这里就贴出一个简单的测试程序:
#include <avr/io.h>
#include <avr/interrupt.h>

#definenop()asm("nop")

unsigned chara=0;

ISR(INT0_vect)    ;外部中断0服务函数
{
    a=1;
}

void DelayMgr1us(unsigned int DelayData)   ;1us延时函数
{
    while((!a)&&(DelayData--))
    {
      nop();nop();
    }
}

int main(void)
{
   DDRD &= ~(1<<2);   ;外部中断0口配置为输入
   SREG &= 0X7F;
   EIMSK |= 0X01;          ;开外部中断0
   EICRA |= 0X03;
   SREG |= 0X80;

   DelayMgr1us(50000);
    nop();nop();
}
先说下我的问题,程序很简单,主意就是当运行到延时函数时,若有中断则a的值赋为1,则不再延时,退出延时函数,可是现在是
我通过单目运行进延时后,人为触发中断,此时程序还正常运行,进入中断服务函数后,a的值也被重新赋为了1,然后退出中断反回到
延时函数内,可a已经为1了,延时函数仍旧一直运行,直至DelayData自减到0为止才退出。但头文件,中断服务函数稍修改后放在ICCAVR环境中编译却是正常。就这个程序,我暂时也不知道是我程序有问题还是编译器有问题,可编译器换过几个还是出一样的问题,程序我也实在看不出问题在哪,
还望高人停下脚步帮小弟看看。感激不尽!!!

Donor 发表于 2012-10-26 17:52:31

#definenop()asm("nop")
可能有问题

yaoyyie2003 发表于 2012-10-26 17:53:54

volatile的问题?你 unsigned chara=0; 改为 volatile unsigned char a=0;试一下.

millwood0 发表于 2012-10-26 17:59:56

int main(void)
{
   DDRD &= ~(1<<2);   ;外部中断0口配置为输入
   SREG &= 0X7F;
   EIMSK |= 0X01;          ;开外部中断0
   EICRA |= 0X03;
   SREG |= 0X80;

   DelayMgr1us(50000);
    nop();nop();
}

If this piece of code worked under ICCAVR or any compiler, you should throw that compiler in the trash bin.

caihong001 发表于 2012-10-27 12:20:28

yaoyyie2003 发表于 2012-10-26 17:53 static/image/common/back.gif
volatile的问题?你 unsigned chara=0; 改为 volatile unsigned char a=0;试一下.

果然如你所说,禁止优化后便好了,花了几天时间被你这一说便搞定了,再次感谢!!!

笑笑我笑了 发表于 2012-10-27 12:46:18

yaoyyie2003 发表于 2012-10-26 17:53 static/image/common/back.gif
volatile的问题?你 unsigned chara=0; 改为 volatile unsigned char a=0;试一下.

那volatile的作用是什么啊?

yaoyyie2003 发表于 2012-10-27 22:19:08

有一种东西叫百度

caihong001 发表于 2012-10-29 09:27:23

笑笑我笑了 发表于 2012-10-27 12:46 static/image/common/back.gif
那volatile的作用是什么啊?

就是禁止b0这个变量优化
页: [1]
查看完整版本: 有关AVR_GCC编译器的奇怪问题,肯求高人停下脚步看看!!!