了解处理器和硬件级别的硬件中断和异常

时间:2015-11-03 14:20:06

标签: exception-handling cpu pic interrupt-handling

经过大量关于中断处理等的阅读后,我仍然可以从一开始就弄清楚中断处理的全过程。

例如: 除以零。 CPU获取指令以将数字除以零并将其发送到ALU。 假设ALU开始分割过程或在启动之前运行一些检查。

  1. 如何向CPU发出异常信号?
  2. CPU如何只知道一个比特信号发生了什么异常?是否有一个寄存器在被中断后读取才知道这个? 2.我的应用程序如何捕获异常? 我是否需要编写一些函数来捕获特定的SIGNAL或其他东西?当我写出像处理程序一样的处理程序时 试试{} 抓住{} 还有一个例外,我怎么知道抛出什么异常并处理好呢?
  3. 让我烦恼的最重要的部分是例如当从键盘向PIC发出中断信号时,pic轮流向CPU发出信号,通过改变相应的INT来发生中断。 但CPU如何知道需要提供什么设备? 当他的INTR引脚开启时,CPU正在执行什么操作? 他是否有例程检查某个具有中断值的寄存器(当PIC打开INT线时由PIC设置?)

    请不要禁止这个帖子,对我来说理解这个话题非常重要,我读了一些研究过的几个弱点但却没有把我的脑袋连接起来。

    感谢。

2 个答案:

答案 0 :(得分:0)

除了引脚之外,通常还有几个与中断相关的事情。通常,对于更新的微控制器,存在一个中断向量,用于寻址每个中断调用,以及一个用于发出中断事件/标志信号的寄存器。

当发生由中断处理的事件并设置特定标志时。根据CPU的优先级和当前状态,上下文切换时间可能会有所不同,例如标记为低优先级的中断,优先级较高的中断必须等到高优先级中断结束。如果嵌套是可能的,则优先级较高的中断可能会中断较低优先级的中断。

在除以0等异常的特定情况下,确实会由ALU检测到,CPU可能会提供或不提供我们将在此类事件中调用的派生中断。对于其他类型的异常,可能无法使用中断,CPU只会采取相应措施,例如重新启动。

作为结论,中断事件将以下列方式发生:

  1. 标记中断事件并设置寄存器上的相应标志
  2. 当时机到来时,CPU会将上下文切换到中断处理程序功能。
  3. 在处理程序结束时,中断标志被清除,CPU准备好在下一个事件发生时重新标记中断。
  4. 同时到达的中断或不同的优先级中断之间的决定因硬件的不同而不同。

答案 1 :(得分:0)

如果以最简单的中断模式在Z80上工作的方式开始,理解中断可能是最简单的。该处理器检查a的状态 在每条指令期间的某个点上称为/ IRQ的引脚;如果引脚被置位并且设置了“中断使能”标志,那么当需要获取下一条指令时,处理器将不会使程序计数器前进或从存储器中读取一个字节,而是禁用“中断使能”标志并“假装”它读取“RST 38h”指令。该指令的行为类似于单字节“CALL 0038h”指令,推动程序计数器并将控制转移到该地址。

0038h的代码然后可以轮询各种外围设备,如果他们需要任何服务,使用“ei”指令重新打开“中断启用”标志,并执行“返回”。如果此时没有外围设备仍然需要立即服务,则代码可以在中断发生之前以其正在执行的任何操作恢复。为了防止在执行“ret”时中断线仍然有效的问题,一些特殊逻辑将确保在该指令(或紧跟在“ei”之后的任何其他指令)期间中断线将被忽略。如果在中断处理程序运行时另一个外设已经开始需要服务,系统将返回原始代码,在返回后处理第一条指令时注意/ IRQ的状态,然后使用RST 38h重新启动序列。

在简单的Z80方法中,只有一种中断;任何外设都可以断言/ IRQ,如果有任何外设,Z80需要询问每个外设是否需要注意。在更高级的系统中,可以有许多不同的中断,因此当外围设备需要服务控制时,可以将其分派给专门处理该外设的例程。然而,相同的一般原则仍然适用:中断有效地将“调用”指令插入到处理器正在执行的任何操作中,确保处理器能够在不连续中断该过程的情况下为所需的注意事项提供服务[在Z80上,它只是禁用中断,但具有多个中断源的系统可以在处理较低优先级时保留较高优先级的源,然后返回到处理器在重新启用中断时所执行的任何操作。