OpenEdv-开源电子网

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

主函数的局部变量与中断函数中的局部变量

[复制链接]

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
发表于 2015-6-1 21:03:35 | 显示全部楼层 |阅读模式
5金钱
当主函数的局部变量与中断函数中的局部变量都存储在XDATA中的时候,有没有可能出现在同一个地址中的情况?

或者说在一个不是很明显的 子函数  test(){int a;int b....}  中断函数{int c,intd },

c和d有没有可能在同一个xdata单元?

如果没有,keil怎么处理这些变量的?

如果可能出现在同一单元,keil怎么处理避免出错?

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

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-6-1 21:07:37 | 显示全部楼层
比如

test()
{
int a ;
int b;
a=a+1;
b=b+1
..........         中断打断。。。。怎么处理a,汇编只能保存b的DPTR(当中断的局部变量与a使用同一XDATA单元)

a=a+1;
}
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-6-1 21:36:18 | 显示全部楼层
或者是说 中断调用Ctest(){ int cc,、。。。。}  cc可能覆盖a么
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-1 21:52:07 | 显示全部楼层
帮顶。。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-6-1 22:44:40 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
原子大哥 hellp keil是怎么实现分配的啊
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-6-1 23:01:15 | 显示全部楼层
回复【5楼】16777216:
---------------------------------
局部变量放在栈里面,用完就释放了,不要纠结什么。
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-6-2 14:01:48 | 显示全部楼层
回复【6楼】TinyBoy:
---------------------------------
如果共用,在还没用完的时候被打断了,中断改变了
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-6-2 14:16:57 | 显示全部楼层
回复【7楼】16777216:
---------------------------------
怎么会共有呢,又不是共用体,栈里面放一个多一个,出一个少一个,要么就溢出,你能想象出怎样的共用情形?
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-6-2 14:19:38 | 显示全部楼层
回复【7楼】16777216:
---------------------------------
就算没地方放了,也不会共用,地方不够了就报错了。
回复

使用道具 举报

40

主题

144

帖子

0

精华

高级会员

Rank: 4

积分
513
金钱
513
注册时间
2013-7-26
在线时间
72 小时
 楼主| 发表于 2015-6-2 23:34:40 | 显示全部楼层
回复【8楼】TinyBoy:
---------------------------------
我的意思是公用 同一个外部XDATA单元 ,比如 临时变量都存在 0x0f01 这个地址中?

然后在主函数用临时变量的时候,取出来,使用了一次,但函数下方还需要使用。

 这个时候中断来打断了,又使用了这个地址的内容,临时变量使用先初始化,但是使用完后,0x0f01里面的内容就变掉了,

然后主函数再使用这个临时变量岂不是乱掉了。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-6-3 08:03:45 | 显示全部楼层
回复【10楼】16777216:
---------------------------------
问题是你用的都是局部变量,主函数里面的局部变量一直不会被释放,中断函数进去一次,又重新定义局部变量,怎么会都存放在同一个地址里面呢。
回复

使用道具 举报

10

主题

561

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1839
金钱
1839
注册时间
2014-6-27
在线时间
982 小时
发表于 2015-6-3 08:26:01 | 显示全部楼层
回复【10楼】16777216:
---------------------------------
你应该之前是使用汇编吧,才有现在的疑问,汇编里面用到寄存器来保存数据,寄存器就是一个指定地址的变量,所以有那个问题,你用C,还是局部变量,这些都不用关心,它会自动处理的。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2015-6-3 10:00:47 | 显示全部楼层
编译器会处理好的,请不要纠结了。C51的情况比较特殊,局部变量不一定是放在栈里的。真想知道,自己去看汇编代码吧。
业余程序玩家。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 18:31

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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