打印
[AVR单片机]

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

[复制链接]
1448|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用起来也很方便。

使用特权

评论回复
5
zhangquanchang|  楼主 | 2015-4-13 20:49 | 只看该作者
奇怪的很,在全局变量前加上volatile也不行。

使用特权

评论回复
6
zhangquanchang|  楼主 | 2015-4-13 20:55 | 只看该作者
找到原因了,我犯了个很低级的错误,即编译时我选成了M103 Mode。其实全局变量前不用加volatile也行,谢谢各位。

使用特权

评论回复
评论
知你不知wo 2020-8-29 09:26 回复TA
问下M103 Mode是啥?你这原程序应该是没问题的 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

18

帖子

0

粉丝