OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7390|回复: 6

请教一下单片机中中断访问全局变量的问题

[复制链接]

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
发表于 2017-1-22 19:23:58 | 显示全部楼层 |阅读模式
5金钱
起初是用P3.2的下降沿来反转P1的电平,发现无效。
然后调试一番后发现,中断函数中确实能访问到全局变量,但是改动只在中断服务的函数内有效,中断结束后一旦返回主函数,全局变量的数值又变回了中断发生前的值。
然后查了一些资料,发现是因为编译器优化导致中断服务函数访问到的全局变量是内存中的实际变量在寄存器中的一个副本,中断服务如果想在中断中改变全局变量的值并且使其影响到主函数,要在变量定义时使用 volatile 关键字来声明这是一个随时可能变化的函数,是编译器不对该变量做优化而保证每次使用该变量时都从实际内存地址中重新读取该变量。
然而我在修改代码后,运行结果仍然没有什么区别,中断服务中改变的全局变量仍然无法影响到主函数。
以下是代码:
//////////////////////////////////////////////////////////
#include<REG52.H>
#include<INTRINS.H>
volatile unsigned char status=0;
void isr_int0(void);//中断服务函数
void delay(void);//中断中的防抖延时
int main(void)
{                               
        P1=0x00;
        EX0=1;
        IT0=1;
        EA=1;
        while(1)                                               
        {
                if(status)        P1=0x00;
                else                P1=0xFF;
        }
       
}
void isr_int0(void) interrupt 0
{
        status=!status;
        delay();
}
void delay(void)
{
        unsigned char i, j, k;
        _nop_();
        i = 2;
        j = 103;
        k = 147;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

//////////////////////////////////////////////////////////
跪求大神

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

58

主题

6293

帖子

1

精华

资深版主

Rank: 8Rank: 8

积分
11460
金钱
11460
注册时间
2014-4-1
在线时间
1294 小时
发表于 2017-1-22 20:03:56 | 显示全部楼层

奇怪,不应当啊,
把优化关掉试试。

会不会是外部中断太频繁,变了两次,所以又回到原来那样?

回复

使用道具 举报

4

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
97
金钱
97
注册时间
2018-2-12
在线时间
23 小时
 楼主| 发表于 2017-1-22 20:17:59 | 显示全部楼层
xuande 发表于 2017-1-22 20:03
奇怪,不应当啊,
把优化关掉试试。

所以我的中断函数中加了200ms的延时了……
优化级别也调成0了
困扰了三天了
无标题.png
回复

使用道具 举报

0

主题

22

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1078
金钱
1078
注册时间
2016-2-15
在线时间
273 小时
发表于 2017-2-3 21:46:18 | 显示全部楼层
看到volatile 关键字比较感兴趣,试了下你这个程序,没什么问题,但也有比较有趣的现象,就是用普通的按钮开关测试P1是不会反转的,用传感器替代普通按钮开关触发P1反转就没问题。引出一个问题:普通按钮开关的抖动为什么总是成双的出现呢?取消你这个所谓的抗抖动的延时再测试,普通按钮的抖动显现比较正常,P1有时反转有时不反转。
回复

使用道具 举报

头像被屏蔽

100

主题

111

帖子

0

精华

禁止发言

积分
416
金钱
416
注册时间
2017-2-5
在线时间
20 小时
发表于 2017-2-12 10:01:11 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

37

主题

204

帖子

0

精华

高级会员

Rank: 4

积分
717
金钱
717
注册时间
2016-6-10
在线时间
191 小时
发表于 2017-2-15 12:33:17 | 显示全部楼层
不可能的,那以前做实验时,定时器中断计数,count++,按照你这样说永远都计不满了。。。。程序写的又问题吧
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2017-2-17 15:25:22 | 显示全部楼层
sea_blue 发表于 2017-2-3 21:46
看到volatile 关键字比较感兴趣,试了下你这个程序,没什么问题,但也有比较有趣的现象,就是用普通的按钮 ...

看汇编指令RETI  执行是会清除中断标志位
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-1 15:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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