zhangquanchang 发表于 2015-4-10 22:22

很奇怪的问题-AVR中全局变量和局部变量

在AVR128中,我用了一个延时函数,程序如下:
void delay_1ms(void)               //1ms延时函数
{
   unsigned int i;
   for (i=0;i<1714;i++); //1142=XTAL*143-2=8*143-2
}
   
void delay_nms(unsigned int n)       //N ms延时函数
{
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
}
主程序如下:
void main(void)
{
    unsigned int one=40;
    unsigned int two=3;
    JTAG_DIS|=MCUCSR_JTD;
    JTAG_DIS|=MCUCSR_JTD;
    MCUCR=0x00;
    DDRB=0xff;   //端口为输出
    PORTB=0x00;
    pwm0_init();    PORTA=0X00;
    DDRA=0XFF;
   
    while(1)
    {
          delay_nms(one);
          PORTA=0XFF;
          delay_nms(two);
          PORTA=0X00;
   }

也就是说,我如果在主程序里定义了one和two这两个变局,即定义成局部变量,延时函数是正常的。但我如把这两个变量定义成全局变量,即:
#include <iom128v.h>
#include <macros.h>
#define JTAG_DISMCUCSR
#define MCUCSR_JTD0x80
unsigned int one=40;
unsigned int two=3;
结果程序就不正常了,即延时函数就不正常了,请高手帮我分析一下,这是怎么回事,谢谢。

ofourme 发表于 2015-4-12 10:12

估计被编译器优化了吧。看一下汇编吧。

w_qswqs 发表于 2015-4-13 15:00

加 volatile

shaoziyang 发表于 2015-4-13 15:34

对,需要加volatile关键字。另外为什么延时不直接用库函数?库函数_delay_ms用起来也很方便。

zhangquanchang 发表于 2015-4-13 20:49

奇怪的很,在全局变量前加上volatile也不行。

zhangquanchang 发表于 2015-4-13 20:55

找到原因了,我犯了个很低级的错误,即编译时我选成了M103 Mode。其实全局变量前不用加volatile也行,谢谢各位。
页: [1]
查看完整版本: 很奇怪的问题-AVR中全局变量和局部变量