打印
[MCU]

中断服务子程序里的局部变量问题

[复制链接]
1827|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
2013搬运工|  楼主 | 2015-10-27 21:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
2013搬运工|  楼主 | 2015-10-27 22:01 | 只看该作者
求解!

使用特权

评论回复
板凳
ayb_ice| | 2015-10-28 07:55 | 只看该作者
使用上和其它局部变量没有 什么两样

中断执行时才有意义

使用特权

评论回复
地板
2013搬运工|  楼主 | 2015-10-28 20:35 | 只看该作者
ayb_ice 发表于 2015-10-28 07:55
使用上和其它局部变量没有 什么两样

中断执行时才有意义

好的,谢谢!

使用特权

评论回复
5
NE5532| | 2015-10-28 20:51 | 只看该作者
从搞C语言开发的角度看,是个局部产量,从懂汇编的人来看,本质上是个全局变量,只是其他程序访问不了而已。当然如果被分配成寄存器产量,就不“全局”了。

使用特权

评论回复
6
无量寿经| | 2015-10-28 21:05 | 只看该作者
以下内容来源于《51单片机轻松入门—基于STC15W4K系列》
局部变量 :
① 在一个函数内部定义的变量是局部变量,只能在函数内部使用(使用关键字auto,static,默认值auto可省略),在主函数内部定义的变量也是局部变量,其它函数也不能使用主函数中的变量。
② 局部变量在没有赋值以前的值是不确定的,是以前残留在内存里的随机值,所以在定义局部变量的时候一定要初始化。
③ 实际参数变量属于主调函数的局部变量。
④ 形式参数变量属于被调函数的局部变量,它的作用范围仅限于函数内部所用的语句块。
⑤ 在复合语句中定义的变量是局部于复合语句的变量,只能在复合语句块中使用。
⑥ 不同函数中可以使用同名变量,它们作用域不同,因此不会发生冲突。
⑦ 局部变量在函数被调用的过程中动态占有存储单元,调用结束立即释放。
全局变量 :
① 在函数外部定义的变量是全局变量,其作用域是变量定义位置开始至整个程序文件结束,可使用前缀auto,static,默认值auto可省略,实际中全局变量一般是在程序的开头位置定义。
② 全局变量在没有赋值以前系统默认为0,全局变量初始化是在其定义时进行的,而其初始化仅执行一次,这种规则对于数组、结构体和联合体也同样适用。
③ 使用全局变量可增加函数间数据传递的渠道,全局变量可以将数据传入在作用域范围内的函数,也可以将数据传回到作用域范围内的其它函数,使用全局变量可让函数传回多个值,但一定要注意全局变量传递数据是数据传递的后门,全局变量在程序中任何地方都可以更新,使用全局变量会降低程序的安全性与移植性,因此,原则上尽量少用全局变量,能用局部变量的就不用全局变量,要避免局部变量全局化。
④ 使用其它文件的全局变量,可通过extern关键字引用,或用文件包含处理。
⑤ 局部变量若与全局变量同名,则在局部变量的作用域内,全局变量存在,但不可见,全局变量的作用被屏蔽。
⑥ 全局变量在程序运行过程中一直占用RAM存储单元。

使用特权

评论回复
7
2013搬运工|  楼主 | 2015-10-29 21:29 | 只看该作者
无量寿经 发表于 2015-10-28 21:05
以下内容来源于《51单片机轻松入门—基于STC15W4K系列》
局部变量 :① 在一个函数内部定义的变量是局部变 ...

局部变量与全局变量的区别我还是明白的,我想了解的是,中断程序中的局部变量有没有什么特别?例如像全局变量一样存储。谢谢指教!

使用特权

评论回复
8
NE5532| | 2015-10-29 21:36 | 只看该作者
本来就是个全局变量。请仔细咀嚼5楼的回帖。

使用特权

评论回复
9
2013搬运工|  楼主 | 2015-10-29 21:53 | 只看该作者
NE5532 发表于 2015-10-29 21:36
本来就是个全局变量。请仔细咀嚼5楼的回帖。

确定?如果我这样定义中断程序中的变量:int cnt;++cnt;中断十次后,cnt=?

使用特权

评论回复
10
ayb_ice| | 2015-10-30 08:07 | 只看该作者
2013搬运工 发表于 2015-10-29 21:53
确定?如果我这样定义中断程序中的变量:int cnt;++cnt;中断十次后,cnt=?

标准情况下为未知值或随机值

NE5532的意思其实是说这个变量也有地址,在汇编下当然可以当全局变量使用,只要声明好就可以了,但在C里函数的局部变量外部无法使用


使用特权

评论回复
11
ningling_21| | 2015-10-30 08:47 | 只看该作者
2013搬运工 发表于 2015-10-29 21:53
确定?如果我这样定义中断程序中的变量:int cnt;++cnt;中断十次后,cnt=?

在中断中临时存储,中断退出就会自动销毁的变量

使用特权

评论回复
12
elife| | 2015-10-30 11:28 | 只看该作者
应该存储在栈中,局部变量应该是地址变化的,编译时应该指定为当前堆栈指针的相对位置。运行时会根据堆栈指针找到相应位置。

使用特权

评论回复
13
2013搬运工|  楼主 | 2015-10-30 19:42 | 只看该作者
elife 发表于 2015-10-30 11:28
应该存储在栈中,局部变量应该是地址变化的,编译时应该指定为当前堆栈指针的相对位置。运行时会根据堆栈指 ...

我的理解跟你差不多,因为中断程序有特定的入口地址。楼上说的,因为不会汇编不太理解。

使用特权

评论回复
14
NE5532| | 2015-10-31 20:25 | 只看该作者
所以看汇编可以知道底细。楼主++的形式确实得不到想要的。说全局,只是从地址分配和复用的角度看的。楼主想++的话,可以用static声明。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

44

帖子

0

粉丝