13 12
发新话题
打印

中断的使用

本主题由 亲善大使 于 2008-8-23 04:38 审核通过

中断的使用

在中断中可不可以定义变量?好不好
在编写单片机的程序中,中断服务程序中可以定义变量,如果希望下一次再进入中断的时候还可以保留变量原来的值,就需要把它设置为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、返回到中断点。

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

回复 沙发 的帖子

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

回复 4楼仙猫 的帖子

哈,中断、堆栈,俺是不了解的,所以写出这么多,也是想把一些问题讨论的更明白些哈,谢谢仙猫!
对全局变量和static型变量我一直是有疑问的:
对于一个数据的定义,有两种属性:数据类型和存储类型;
一个变量的存储类型,从作用域角度分:局部变量和全局变量;
                    从存在时间来分:动态变量和静态变量;
而静态的意思是不是,在函数调用结束后仍保留原值?
全局变量是因为作用域比较长所以也能够保留很长时间,是这样吗?
这样看来,两者能实现的功能似乎相同啊?那么有什么区别呢?在什么情况下需要区别呢?
程序里的变量,其实就是一些用于保存运算结果的存贮器单元。在高级语言写的程序里,那些变量的绝对地址是由编译器分配的,这样让程序员轻松点,不必去费那脑筋。

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

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

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

回复 6楼仙猫 的帖子

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

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

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

用汇编语言的话,自己是不是就是那个编译器呢?嘿~~~

说d都对

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

关于为什么叫background

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

谢谢仙猫

引用:
原帖由 仙猫 于 2008-8-25 16:04 发表
因为如把“主程序”和中断服务看作同一种东东的话,它就是优先级最低的中断服务——谁都能打断它,而且谁都不会被它 ...
脑袋转一转,还真是这样啊~~不过计算机这个东西现在就像在我面前的一座大山,俺得慢慢凿出一条路来才能一览众山小哦~~心急吃不了热豆腐,我觉得自己非得一点点都弄明白才行,不然总是感觉不能如鱼得水应用自如啊~~
谢谢仙猫!
 13 12
发新话题