搜索
bottom↓
回复: 10

中断函数里能对变量进行定义吗?

[复制链接]

出0入0汤圆

发表于 2017-2-16 15:12:55 | 显示全部楼层 |阅读模式
本帖最后由 rjx 于 2017-2-16 16:34 编辑

中断函数里能对变量进行定义吗?
编译时,虽没报错,但给出了警告,意思是虽然定义了,但不能用。
改为全局变量就没有警告了。
如:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
   uchar count,count1;
   uchar min,sec;
   TCNT0 = 61;
    count++;
    if(count==2)      
        { FLAG=1;    }
     else if(count==4)
        {FLAG=0;  count=0;   }  
        
     count1++;
    if(count1==40)      
        { sec++; count1=0;   }
    if(sec==30)
        {min++;  sec=0;   }
    if(min>60)
        {min=0;}   
   
}

警告信息:(其中的一条)
Warning: D:\DSQ20171\PUMP20172\pump.c(404): local variable 'count' is used before it's value is set

阿莫论坛20周年了!感谢大家的支持与爱护!!

阿莫论坛才是最爱国的,关心国家的经济、社会的发展、担心国家被别国牵连卷入战争、知道珍惜来之不易的和平发展,知道师夷之长,关注世界的先进文化与技术,也探讨中国文化的博大精深,也懂得警惕民粹主义的祸国殃民等等等等,无不是爱国忧民的表现。(坛友:tianxian)

出0入49汤圆

发表于 2017-2-16 15:13:47 | 显示全部楼层
可以定义的,像你这样用应该定义成静态变量吧static,具体是提示什么类型的警告啊

出0入8汤圆

发表于 2017-2-16 15:26:35 | 显示全部楼层
你需要的是 static,或者 global 存储类型的变量,而不是 local。

出0入8汤圆

发表于 2017-2-16 15:30:12 | 显示全部楼层
huali8412 发表于 2017-2-16 15:13
可以定义的,像你这样用应该定义成静态变量吧static,具体是提示什么类型的警告啊 ...

I thought maybe i had found u are lady gaga.

出0入8汤圆

发表于 2017-2-16 15:35:02 | 显示全部楼层
本帖最后由 security 于 2017-2-16 15:36 编辑

你要明白,这些时间计数变量,生命周期是要一直存在的,全局唯一的。
而不是离开了函数就销毁,进入函数再重新分配。

去啃啃 C 基础。
看看局部、全局变量,静态变量的知识。

出0入0汤圆

 楼主| 发表于 2017-2-16 16:35:33 | 显示全部楼层
本帖最后由 rjx 于 2017-2-16 16:37 编辑

警告信息如下:(只是其中一条)
Warning: D:\DSQ20171\PUMP20172\pump.c(404): local variable 'count' is used before it's value is set

如果定义成static也没有警告了。

出0入0汤圆

发表于 2017-2-16 21:33:56 来自手机 | 显示全部楼层
编译器不关心你定义的是不是静态,警告是告诉你你用局部变量应该给个初值!

出0入0汤圆

发表于 2017-2-16 21:47:27 | 显示全部楼层
你先看看书,了解 局部、全局变量,静态变量的区别吧
要知道错在哪里才能彻底解决问题啊!否则即使编译器没报错,可能会出现莫名其妙的问题,得到的结果并不是你需要的。

出10入23汤圆

发表于 2017-2-16 21:50:57 | 显示全部楼层
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
   uchar count,count1;
   uchar min,sec;
   TCNT0 = 61;
    count++;
    if(count==2)      
        { FLAG=1;    }
     else if(count==4)
        {FLAG=0;  count=0;   }  
        
     count1++;
    if(count1==40)      
        { sec++; count1=0;   }
    if(sec==30)
        {min++;  sec=0;   }
    if(min>60)
        {min=0;}   
   
}

第6行“count++;”使用了count变量,然而第3行“uchar count,count1;”却没有给count赋初始值
改为uchar count = 0, count1;即可

出0入0汤圆

发表于 2017-2-16 21:51:28 | 显示全部楼层
count ++; count的初值是多少呢
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-16 17:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表