OpenEdv-开源电子网

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

中断局部变量的处理

[复制链接]

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
发表于 2015-5-23 20:08:25 | 显示全部楼层 |阅读模式
5金钱
临时函数1()
{
uint8_t  a;
........
}

中断函数1()
{
uint8_t   b;
临时函数1()
........
}

临时函数2()
{
uint8_t  c;
........
}
中断函数2()
{
uint8_t  d;
临时函数2()
}

问题来了:
keil C51 在存储这些临时变量的时候使用外部XDATA存储,a,b,c,d 这四个临时变量有可能使用同一个XDATA地址么,如果可能,这样不就会有风险产生么?
a,c 之间明显没有调用关系,那么假设a,c使用了相同的Xdata区域,先后进入中断1,2 ,那不是会导致明显的错误么?

或者说keil怎么处理中断中的临时变量?

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

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-5-23 20:30:37 | 显示全部楼层
临时变量出了函数就释放    所以就没意义了
学无止境
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-5-23 20:51:42 | 显示全部楼层
回复【2楼】jermy_z:
---------------------------------
在中断1执行时,被中断2 (优先级更高)打断,改变同样地址的内容
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-5-23 20:55:28 | 显示全部楼层
中断局部变量:
1.中断函数中的变量和其它函数是一样的可以使用全局变量,也可以使用局部变量。如果是局部变量,在不同中断中变量重名时是不会有影响的。
2.C51中局部变量是地址固定的,并且不互相调用的函数的局部变量地址可能是一样的。
3.中断函数的局部变量(少量)一般被分配在寄存器中,而被用到的寄存器会被压栈保护。原来的函数不会被影响。
4.C51编译程序检查所有的局部变量和所有函数的调用树,把它认为不会冲突的局部变量共用一个RAM地址,局部变量重名不会冲突,不论中断函数  还是一般函数。
5.中断中定义静态局部变量可以受到保护

其他的期待回答
回复

使用道具 举报

70

主题

6697

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12691
金钱
12691
注册时间
2012-11-26
在线时间
3710 小时
发表于 2015-5-23 22:27:07 | 显示全部楼层
回复【3楼】16777216:
---------------------------------
找些堆栈的知识看看吧
学无止境
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-5-23 22:52:07 | 显示全部楼层
回复【5楼】jermy_z:
---------------------------------
使用前压栈保存? 我的意思是会不会出现 编译器 分配了同样地址,然后使用的时候没有注意?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 09:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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