3813|11

58

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

关于函数变量的问题 [复制链接]

u8 k=0;
void I2cRead() interrupt 2
{
        //static u8 k=0;
       //k=0;
        INTTemp=INTTemp<<1;
        INTTemp=INTTemp|SDA;               
        k=k+1;
        if (k==8)
          {  
                 INTre[INTbyteflag]=INTTemp;
                 INTbyteflag++;
                 k=0;
                if(INTbyteflag>2&&INTre[2]+3==INTbyteflag)                        //接收的长度等于定义的长度,说明接收完毕
                        {
                                INTbyteflag=0;
                                     INTflag=1;
                        }
          }


如上,是通过INT1中断接收数据的程序。通过仿真的时候发现k的值为上图所显示的值,导致程序运行不正常。我把变量定义成局部变量或者静态变量都不行,只有当把k=0,放进中断函数时,k的值才正常。但是我不能每次进中断的时候,把k的值清零。清各位帮我想想这是原因,或者有没有什么其他办法。谢谢了。

1.png (12.21 KB, 下载次数: 0)

1.png
此帖出自51单片机论坛

最新回复

我现在怀疑是编译器没有把K认为成全局变量,而是一个局部变量,这样同一个地址被多个变量共用也是有可能的.你试一下把所有优化都关掉看看是否能行。我曾经见过一个比这个还要莫名其妙的情况,用的是keil,在某些情况下,只要多定义一个变量,整个程序都无法运行的情况,最关键的就是编译器没有报任何错,而且会生成HEX文件,但烧进去死活都不运行,连仿真器调试都进不去。所以我怀疑你是不是也遇到了类似的情况。  详情 回复 发表于 2015-9-8 17:51
点赞 关注
 

回复
举报

1781

帖子

0

TA的资源

五彩晶圆(中级)

沙发
 
中断函数里面的计数变量只能用全局变量吧,你看一看是不是别的程序也使用了这个K,实在不行就定义一个专门名字,比如IIC_K,这样和别的变量区分开,肯定是有别的程序修改了这个值,要不然不会这样。
此帖出自51单片机论坛

点评

其他地方没这个变量,我也试着改成其他的变量名,都不行的。  详情 回复 发表于 2015-9-8 09:19
 
个人签名只有求知欲,没有求偶欲的人是植物,只有求偶欲,没有求知欲的人叫动物,既没求知欲,又没求偶欲的人是矿物。
 
 

回复

4008

帖子

0

TA的资源

版主

板凳
 
你程序别的地方有没有修改K值啊
此帖出自51单片机论坛

点评

其他地方没K值的,就这一个地方。  详情 回复 发表于 2015-9-8 09:19
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

4
 
wangjiafu1985 发表于 2015-9-7 14:48
中断函数里面的计数变量只能用全局变量吧,你看一看是不是别的程序也使用了这个K,实在不行就定义一个专门 ...

其他地方没这个变量,我也试着改成其他的变量名,都不行的。
此帖出自51单片机论坛

点评

你是不是多个C文件啊,有没有试过把K值的声明移到主函数所在的那个文件里面。看你的调试页面感觉K好像是局部变量,而不是全局变量。  详情 回复 发表于 2015-9-8 09:41
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

5
 
huo_hu 发表于 2015-9-7 15:30
你程序别的地方有没有修改K值啊

其他地方没K值的,就这一个地方。
此帖出自51单片机论坛
 
 
 

回复

1781

帖子

0

TA的资源

五彩晶圆(中级)

6
 
brain发烧友 发表于 2015-9-8 09:19
其他地方没这个变量,我也试着改成其他的变量名,都不行的。

你是不是多个C文件啊,有没有试过把K值的声明移到主函数所在的那个文件里面。看你的调试页面感觉K好像是局部变量,而不是全局变量。
此帖出自51单片机论坛

点评

是多个c文件,但只是在这个c文件用到k的值,我试过7楼的方法,给k赋值0都不行,为什么k这顽固?  详情 回复 发表于 2015-9-8 11:41
 
个人签名只有求知欲,没有求偶欲的人是植物,只有求偶欲,没有求知欲的人叫动物,既没求知欲,又没求偶欲的人是矿物。
 
 

回复

1万

帖子

25

TA的资源

裸片初长成(高级)

7
 
用 if (k > 8) 试试
此帖出自51单片机论坛

点评

我试了也不行,感觉k的值是固定的,清零没用。  详情 回复 发表于 2015-9-8 11:39
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

8
 
dontium 发表于 2015-9-8 10:09
用 if (k > 8) 试试

我试了也不行,感觉k的值是固定的,清零没用。
此帖出自51单片机论坛
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

9
 
wangjiafu1985 发表于 2015-9-8 09:41
你是不是多个C文件啊,有没有试过把K值的声明移到主函数所在的那个文件里面。看你的调试页面感觉K好像 ...

是多个c文件,但只是在这个c文件用到k的值,我试过7楼的方法,给k赋值0都不行,为什么k这顽固?
此帖出自51单片机论坛

点评

我现在怀疑是编译器没有把K认为成全局变量,而是一个局部变量,这样同一个地址被多个变量共用也是有可能的.你试一下把所有优化都关掉看看是否能行。我曾经见过一个比这个还要莫名其妙的情况,用的是keil,在某些情况下  详情 回复 发表于 2015-9-8 17:51
 
 
 

回复

4008

帖子

0

TA的资源

版主

10
 
怀疑是你中断的问题,调试输出到数组看看,另外你的
if(INTbyteflag>2&&INTre[2]+3==INTbyteflag)    逻辑能保证对莫,特别是最后一个==
此帖出自51单片机论坛
 
 
 

回复

1781

帖子

0

TA的资源

五彩晶圆(中级)

11
 
brain发烧友 发表于 2015-9-8 11:41
是多个c文件,但只是在这个c文件用到k的值,我试过7楼的方法,给k赋值0都不行,为什么k这顽固?

我现在怀疑是编译器没有把K认为成全局变量,而是一个局部变量,这样同一个地址被多个变量共用也是有可能的.你试一下把所有优化都关掉看看是否能行。我曾经见过一个比这个还要莫名其妙的情况,用的是keil,在某些情况下,只要多定义一个变量,整个程序都无法运行的情况,最关键的就是编译器没有报任何错,而且会生成HEX文件,但烧进去死活都不运行,连仿真器调试都进不去。所以我怀疑你是不是也遇到了类似的情况。
此帖出自51单片机论坛

点评

我总算找到原因了,之前如图由于我的变量数为299超过了51单片机的片内ram的存储空间255,所以导致地址空间不足,而后,我在keil编译器Memory Model选择了compact模式,再重新编译就成功了,同时发现1楼的问题,当我  详情 回复 发表于 2015-9-9 14:58
 
个人签名只有求知欲,没有求偶欲的人是植物,只有求偶欲,没有求知欲的人叫动物,既没求知欲,又没求偶欲的人是矿物。
 
 

回复

58

帖子

0

TA的资源

一粒金砂(中级)

12
 
本帖最后由 brain发烧友 于 2015-9-9 15:12 编辑
wangjiafu1985 发表于 2015-9-8 17:51
我现在怀疑是编译器没有把K认为成全局变量,而是一个局部变量,这样同一个地址被多个变量共用也是有可能的. ...

我总算找到原因了,之前如图由于我的变量数为299超过了51单片机的片内ram的存储空间256,所以导致地址空间不足。谢谢各位的热心回答。
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表