6705|12

11

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

中断的使用 [复制链接]

在中断中可不可以定义变量?好不好
此帖出自模拟电子论坛

最新回复

LSJ
变量的存储类型: 外部变量内部变量在所有函数之前定义的变量 在某个函数内定义的变量 全局变量 Global 开辟内存空间后自始至终都存在 其他文件需访问用extern声明 动态变量 Auto 先用先开辟,用完之后不保存 没有记忆 全局静态变量 Static 开辟内存空间后自始至终都存在 不同的是, 对于global,其他文件还可以访问 对于static,退出被定义文件后,值仍存在,但其他文件不可以访问 局部静态变量 Static 开辟内存空间后自始至终都存在 值保留,只有被定义函数可以访问,其他函数不能访问 寄存器变量 Register 作用范围同auto型变量 用于使用频率高的变量 但通用寄存器个数很有限,应慎用 Keil Cx51编译器还扩展了变量的数据类型:bit, sbit, sfr, sfr16 Keil Cx51还允许说明存储器类型: 存储器类型 说明 DATA 直接寻址的片内RAM(128B),访问速度最快 BDATA 可位寻址的片内RAM(16B) IDATA 间接访问的片内RAM(256B) PDATA 分页寻址的片外RAM,(256B)MOVX @Ri指令 XDATA 片外RAM(64KB),MOVX @DPTR指令 CODE ROM,MOVC指令 这样,一个变量的属性就变成了三个: 存储类型  数据类型  存储器类型  变量名; 那么,我就有了这样的理解: 变量——等价于一个存储单元; 存储类型——规定了这个存储单元存在的时间; 数据类型——规定了这个存储单元的长度; 存储器类型——规定了这个存储单元的大概位置; 如果这个位置还要更精确一些,为了便于进行下一步的操作,还可以指定变量的绝对地址。 这样好像就有了一种立体感。 不过还想再问几个问题: 1、 越来越觉得编译器太神奇了,竟然能够进行翻译!一种用人脑来完成都要动脑筋的东西~~究竟是如何实现的?如果要了解的话是不是应该看编译看编译原理方面的书籍? 2、为什么通用寄存器的存取速度快?在结构上它和其他存储器比如内存有什么区别呢? 恩,也恩,把这些问题也提给自己,以后慢慢解决。自己的一点点理解,希望得到大家的指正,谢谢   详情 回复 发表于 2008-8-26 23:28
点赞 关注

回复
举报

66

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
在编写单片机的程序中,中断服务程序中可以定义变量,如果希望下一次再进入中断的时候还可以保留变量原来的值,就需要把它设置为static型的。比如,定义一个bit型变量作为某种判断的标志。关于好不好的问题,以我现有的知识,好像是解决不了的,很抱歉

一个中断的处理过程大概是这样的:
1、现行指令结束,且没有更紧急的服务请求。
2、关CPU中断,CPU不能再响应其他任何中断源的中断请求。
3、保存中断点,通常是指保存程序计数器PC中的内容,把它压入到系统堆栈中,以便在终端服务完成后返回到原来的程序中去。

4、撤销设备的中断服务请求,如果这个中断源的中断请求不撤销的话,那么在开CPU中断后,它必然将再次请求终端服务。
5、保存硬件现场。
6、识别中断源。
7、改变设备的屏蔽状态。
8、转向中断服务程序入口,一般还要在中断服务程序中通过软件才能找到具体中断源的中断服务程序入口。
9、保存软件现场,主要指保存将要被中断服务程序破坏的通用寄存器中的内容等。
10、开CPU中断,CPU可以响应其他更高级中断源的终端服务请求,中断源之间可以实现中断嵌套。
11、执行中断服务程序。
12、关CPU中断,CPU不响应任何中断源的中断服务请求。在下一次开CPU中断之前,正在运行的程序不允许被中断。

13、恢复软件现场,恢复被中断服务程序破坏的通用寄存器中的内容等。
14、恢复屏蔽状态。
15、恢复硬件现场,主要指恢复处理机状态字PSW及堆栈指针SP等中的内容,准备返回中断点。
16、开CPU中断。
17、返回到中断点。

其中红字的部分一般用硬件实现,蓝字的部分一般用软件实现,其他可以用硬件也可以用软件实现。
从上面这个过程似乎可以得到,在执行中断服务程序之前,很多东西都被保护起来了,所以执行中断程序的时候不必担心破坏什么东西。我们可以对全局变量进行操作,也可以定义一个新的变量,这只是占用了一定的存储空间和时间的问题。
恩,我也不知道自己理解的对不对,毕竟计算机系统结构是很复杂的哈,还希望大家帮忙理解一哈。
此帖出自模拟电子论坛
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

板凳
 

回复 沙发 的帖子

呵呵...真的很感谢你,敲了这么字,写的这么详细,这么细心....
此帖出自模拟电子论坛
 
 
 
 

回复

228

帖子

0

TA的资源

一粒金砂(中级)

4
 
如果是用过就可以扔掉的临时变量,那么是可以在中断服务程序里定义的。编译器一般把函数内定义的临时变量放在堆栈区域里,退出函数即被覆盖掉。
但如果是跟外部有联系,就需要定义成全局变量。假如是数次中断服务前后有联系的变量,那么除了定义全局的做法外,也可用2楼兔兔说“static”的办法,强制编译器为该变量开出专用区域,以便不被其他操作覆盖。在这种情况下全局和static哪个好,俺的看法是:随便。不过俺自己是喜欢尽量写成static的,跟外部没关系的信息尽量在圈内解决,以方便别人阅读程序。
此帖出自模拟电子论坛
 
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼仙猫 的帖子

哈,中断、堆栈,俺是不了解的,所以写出这么多,也是想把一些问题讨论的更明白些哈,谢谢仙猫!
对全局变量和static型变量我一直是有疑问的:
对于一个数据的定义,有两种属性:数据类型和存储类型;
一个变量的存储类型,从作用域角度分:局部变量和全局变量;
                    从存在时间来分:动态变量和静态变量;
而静态的意思是不是,在函数调用结束后仍保留原值?
全局变量是因为作用域比较长所以也能够保留很长时间,是这样吗?
这样看来,两者能实现的功能似乎相同啊?那么有什么区别呢?在什么情况下需要区别呢?
此帖出自模拟电子论坛
 
 
 
 

回复

228

帖子

0

TA的资源

一粒金砂(中级)

6
 
程序里的变量,其实就是一些用于保存运算结果的存贮器单元。在高级语言写的程序里,那些变量的绝对地址是由编译器分配的,这样让程序员轻松点,不必去费那脑筋。

1、但是,假如不分3721给每个变量都规定一个唯一的地址的话,存贮器的使用效率就会很低,为此编译器把大量仅用于运算过程,用过之后不再要的变量的地址以后再分配给别的变量,于是做到了重复使用,这就是“动态变量”。
分配给一个函数内的动态变量的地址,有个好办法就是在堆栈的顶端画出一块区域。一旦退出函数,这块区域仍可以被其他程序重复使用。——这个光读文字去理解恐怕有些难,最好看个具体例子,或单步跟踪一下函数入口处的代码就看懂了。

2、“静态变量”则简单多了,分配给它的地址是个常数,比如0x100。只要程序里不对0x100写的话内容是不会被冲掉的,跟函数退不退出没关系。

3、“全局变量”是最外层的程序(叫Background,或叫主程序,反正不再会被其他程序调用了),使用的变量,它想动态也不行,只可能是静态的(想想,为什么 )。
此帖出自模拟电子论坛
 
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

7
 

回复 6楼仙猫 的帖子

就是说,局部变量可以静,也可以动。在高级语言中,只是我们给出命令,让编译器去分辨,然后进行合理分配?
那俺有个疑问,在用汇编语言编写程序的时候,对于存储空间的分配自己可以直接控制,这样定义的变量,只要自己不去覆盖都不会改变吧?那么都可以理解为高级语言中的全局变量喽?

“——这个光读文字去理解恐怕有些难,最好看个具体例子,或单步跟踪一下函数入口处的代码就看懂了。”
好,我调试的时候注意一下。

关于主程序:主程序最终变成机器码是什么样子的呢?和其他的程序段有什么不同吗?为什么叫做background(后台控制,是这样理解吗?)?

用汇编语言的话,自己是不是就是那个编译器呢?嘿~~~
此帖出自模拟电子论坛
 
 
 
 

回复

228

帖子

0

TA的资源

一粒金砂(中级)

8
 

说d都对

1、用汇编语言写的变量,一般都是全局变量。如果只需局部变量的话,程序员首先想到的是用寄存器。用堆栈的方法是自动化+规格化的产物。
2、用汇编语言写程序,自己就是编译器。所以说,能写低级语言的人,水平是高的。
此帖出自模拟电子论坛
 
 
 
 

回复

228

帖子

0

TA的资源

一粒金砂(中级)

9
 

关于为什么叫background

主程序,忘了在哪儿曾见到过一次叫background的说法,俺搅得这种叫法很在理,至少比“主程序”好。因为如把“主程序”和中断服务看作同一种东东的话,它就是优先级最低的中断服务——谁都能打断它,而且谁都不会被它打断。
此帖出自模拟电子论坛
 
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

10
 

谢谢仙猫

原帖由 仙猫 于 2008-8-25 16:04 发表
因为如把“主程序”和中断服务看作同一种东东的话,它就是优先级最低的中断服务——谁都能打断它,而且谁都不会被它 ...

脑袋转一转,还真是这样啊~~不过计算机这个东西现在就像在我面前的一座大山,俺得慢慢凿出一条路来才能一览众山小哦~~心急吃不了热豆腐,我觉得自己非得一点点都弄明白才行,不然总是感觉不能如鱼得水应用自如啊~~
谢谢仙猫!:P
此帖出自模拟电子论坛
 
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

11
 
看了你们的讨论,学了不少东西,呵呵....
此帖出自模拟电子论坛
 
 
 
 

回复

15

帖子

0

TA的资源

一粒金砂(初级)

12
 
感触良多,谢谢两位!
此帖出自模拟电子论坛
 
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(中级)

13
 

又总结了一点东西




变量的存储类型:
外部变量
内部变量
在所有函数之前定义的变量
在某个函数内定义的变量
全局变量
Global
开辟内存空间后自始至终都存在
其他文件需访问用extern声明
动态变量
Auto
先用先开辟,用完之后不保存
没有记忆
全局静态变量
Static
开辟内存空间后自始至终都存在
不同的是,
对于global,其他文件还可以访问
对于static,退出被定义文件后,值仍存在,但其他文件不可以访问
局部静态变量
Static
开辟内存空间后自始至终都存在
值保留,只有被定义函数可以访问,其他函数不能访问
寄存器变量
Register
作用范围同auto型变量
用于使用频率高的变量
但通用寄存器个数很有限,应慎用


Keil Cx51编译器还扩展了变量的数据类型:bit, sbit, sfr, sfr16

Keil Cx51还允许说明存储器类型:
存储器类型
说明
DATA
直接寻址的片内RAM128B),访问速度最快
BDATA
可位寻址的片内RAM16B
IDATA
间接访问的片内RAM256B
PDATA
分页寻址的片外RAM,(256BMOVX @Ri指令
XDATA
片外RAM64KB),MOVX @DPTR指令
CODE
ROMMOVC指令


这样,一个变量的属性就变成了三个:
存储类型  数据类型  存储器类型  变量名;
那么,我就有了这样的理解:
变量——等价于一个存储单元;
存储类型——规定了这个存储单元存在的时间;
数据类型——规定了这个存储单元的长度;
存储器类型——规定了这个存储单元的大概位置;
如果这个位置还要更精确一些,为了便于进行下一步的操作,还可以指定变量的绝对地址。
这样好像就有了一种立体感。


不过还想再问几个问题:

1、
越来越觉得编译器太神奇了,竟然能够进行翻译!一种用人脑来完成都要动脑筋的东西~~究竟是如何实现的?如果要了解的话是不是应该看编译看编译原理方面的书籍?

2、为什么通用寄存器的存取速度快?在结构上它和其他存储器比如内存有什么区别呢?
恩,也恩,把这些问题也提给自己,以后慢慢解决。自己的一点点理解,希望得到大家的指正,谢谢


此帖出自模拟电子论坛
 
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表