[AVR单片机] 很奇怪的问题-AVR中全局变量和局部变量

[复制链接]
1821|6
 楼主| zhangquanchang 发表于 2015-4-10 22:22 | 显示全部楼层 |阅读模式
在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_DIS  MCUCSR
#define MCUCSR_JTD  0x80
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也行,谢谢各位。

评论

问下M103 Mode是啥?你这原程序应该是没问题的  发表于 2020-8-29 09:26
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

18

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部