单片机与程序设计(下)
断处理的流程请参照本系列《中断功能》的图2。
⇒关于中断的结构和处理流程请参照本系列《中断功能》的内容。
⇒关于看门狗定时器请参照本系列的《定时器》的内容。
(1)首先,在产生中断时,必须使运行中的程序入栈。
(2)在中断处理 "入栈"时,将信息存放在堆栈指针指向的地址(堆栈)中。进行中断处理时存放在堆栈中的信息就是正在执行的原先的程序(被中断的程序)时的程序计数器的值,即原先的程序执行到哪一步的信息(地址)。另外,显示CPU内部状态的信息和暂时保存的值也存放在堆栈中。
(3)如果CPU内部的信息存放在堆栈中且完成"交付"准备(入栈)后,将执行中断程序。中断程序与正在执行的程序不同且所保存的地址空间也不同,所以程序计数器的值与原先程序也完全不同。中断程序的起始位置将被写入向量表中。起始位置该写在向量表中的哪一项取决于所产生的中断。
例如,如果存在不可屏蔽中断(NMI,即CPU不能屏蔽的中断),那就从写有NMI项的地址开始进行处理(请参照《单片机与程序设计(上)》的图2及图3)。
⇒使用向量表进行处理的流程在本系列《单片机与程序设计(上)》中进行解说。
(4)如上所述,向量表的NMI项中的值(地址)将转移到程序计数器中,并从该处开始执行。此外,如将数值设为0而产生错误时,或者欲存取到无存储器的位置时,CPU本身将产生中断并从向量表中读取开始处理的地址。此例中,由于在检测到程序失控时是通过独立的看门狗定时器进行中断处理的,所以中断程序将使系统停止下来。
(5)如为一般的周期性中断,那么,中断处理一结束,且在入栈时将存放在堆栈中的"执行原先执行程序时的信息"返回到CPU。最后返回程序计数器的值,并结束从中断返回的处理"出栈"。
开始中断程序时,通过来自外部的信号或从CPU本身发出的指令来开始入栈。出栈时使用"来自中断的出栈指令",因此编程人员无需考虑"堆栈中存放有什么信息又是按什么顺序来存放的?"等问题,仅需一条指令便可进行出栈处理。
结合上期《单片机与程序设计(上)》的内容,从执行程序的观点来分析,本期对于CPU中到底产生了什么变化进行了说明。程序存放在地址空间中,且在向量表中保存有起始地址,而且还有将信息暂时存放的被称为堆栈的内容等等……,在进行嵌入式编程时,必须同时考虑这些内部动作后再进行编程。如果可通过程序对于更细微的部分发出指示,且能发挥出该单片机的能力的话,编程将变得更加容易。
本系列共分4期,本期为最后一期。尽管每一期都只介绍非常基础的内容,对于那些内容,我们也尽量做到即使对于完全不具备相关知识的读者也能看得懂。所以,请您也反复阅读,我们相信您一定会完全理解其内容的。
- 单片机与程序设计(上)(08-12)
- 周立功手把手教你学嵌入式编程:函数指针与指针函数的应用(07-29)
- 周立功教你学程序设计技术:做好软件模块的分层设计,回调函数要这样写(07-30)
- 周立功《程序设计与数据结构》:字符串函数(08-05)
- 周立功教你学程序设计结构体:内存对齐和基本数据类型(08-01)
- 不完全类型和抽象数据类型的定义(08-14)