hardware - 到底是什么中断?

标签 hardware interrupt cpu-architecture 6502

我想了解Logisim中类似我的6502工作处理器项目的确切中断是什么。
我知道中断会执行以下步骤:

  • 停止处理当前程序
  • 将所有未完成的数据保存到堆栈中
  • 是否“SOMETHING”
  • 加载未完成的数据,让程序继续正常运行。
    我的问题是:在“SOMETHING” 步骤期间会发生什么?程序计数器是否重定向到要执行的特殊程序?像读取按钮的ASCII码并将其保存到寄存器或某个存储位置中一样吗?如果是这样,那个特殊程序通常存储在存储器中的什么位置?能否制造出可以处理各种中断的CPU?也许如果您按下按钮“a”,那么它的ASCII将被存储在A寄存器中,但是如果您按下按钮“b”,那么它将被存储在X寄存器中?

  • 任何帮助是极大的赞赏。
    编辑:谢谢大家的答案。我学到了很多东西,现在可以继续进行我的项目了。

    最佳答案

    My question is: what happens during that "SOMETHING" step? Does the program counter get redirected to a special program to be executed?



    6502可屏蔽中断会发生以下情况:
  • 引发中断(通过这意味着芯片上的中断引脚被强制为低电平。
  • 当需要执行一条新指令时,6502会检查中断引脚是否为低电平,以及状态寄存器中的中断屏蔽是否未设置。如果不是这种情况,即中断引脚为高电平或中断屏蔽为高电平,则CPU继续运行。
  • 假设需要中断,CPU将PC保存在堆栈中
  • 然后,CPU将状态寄存器保存在堆栈中,但B位设置为0。B位为“break”位。对于BRK指令,它将设置为1,这是区分硬件中断和BRK指令之间区别的唯一方法。
  • 然后,CPU在$FFFE$FFFF位置获取地址,并将其填充到PC中,因此从该地址再次开始执行。

  • 这就是全部。一切由程序员决定,直到程序员执行RTI为止,然后将状态字和返回地址从堆栈中拉出并恢复到各自的寄存器中。保存所有寄存器和其他数据是程序员的责任。

    Does the program counter get redirected to a special program to be executed? Something like reading the pressed button's ASCII code and saving that into a register or some memory location?



    那是对的。在基于6502的计算机系统中,内存顶部有三个向量:
    $FFFA - $FFFB:不可屏蔽的中断(如上所述,除了状态寄存器中的I位被忽略外)。
    $FFFC - $FFFD:CPU检测到复位时使用的复位向量
    $FFFE - $FFFF:正常中断向量。

    上面的内容通常在ROM中,因为CPU上电时必须至少有一个复位向量。每个地址都将指向机器操作系统中用于处理中断的例程。

    通常,中断例程将首先通过RAM中存储的向量进行间接跳转。这允许在机器运行时更​​改中断例程。

    然后,中断例程必须确定中断源。例如,在Commodore PET上,中断可能源自VIA芯片或任一PIA芯片,并且每个中断都可能由于各种原因而引发中断,例如:当监视器进行垂直空白显示时,即完成扫描屏幕并返回到第一行时,其中一个PIA芯片会引发中断。在此中断期间,PET执行一个例程以扫描键盘,并执行另一个例程以反转光标。当VIA计时器为零时,程序员可能会插入一个中断例程,例如,切换输出线以产生方波以产生声音,则可能会发生另一个中断。

    评论中问题的一些答案。

    program counter goes to address $FFFE to get relocate to the address



    不,程序计数器设置为该地址上的任何内容。如果你有:
    FFFE: 00 
    FFFF: 10
    

    程序计数器将被设置为$1000(6502为小字节序),这是中断例程必须开始的地方。同样,NMI的向量在$FFFA上。普通中断与$FFFE指令而不是NMI共享BRK

    What exactly the reset vector does? Does it reset the cpu?



    复位向量包含在处理器加电后或发生复位时运行的代码的位置。

    What's the difference between NMI and IRQ? Then I also would like to know what's up with masking? Is it the way to set the "I" flag in Processor Status Register high or low?



    6502状态寄存器包含七个标志。通常,它们与算术指令的结果有关,例如如果运算结果为零,则设置Z;当运算溢出8位并移位时,设置C。 I标志启用和禁用普通中断(IRQ)。如果为零,将考虑IRQ上的中断。如果为1,则禁止中断。您可以使用SEICLI指令手动设置和禁用它,并且在发生中断时会自动设置它(这是为了防止中断中断中断)。

    NMI是不可屏蔽的中断。不同之处在于它忽略了I标志的状态,并使用了不同的向量。

    And finally, what are vectors? Are they synonymous for indirect addresses?



    是的。

    Oh, and if you do know, how are interrupt addresses starting from $FFFA stored in ROM instead of RAM in real 6502?



    您必须安排地址解码逻辑将这些地址指向ROM而不是RAM。实际上,在Commodore系统中,$F000的整个块都是包含操作系统一部分的ROM。这可能适用于大多数其他基于6502的系统。

    关于hardware - 到底是什么中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55279502/

    相关文章:

    c++ - 给定代码片段中引用的时间和空间局部性的所有出现

    c - 读取帧缓冲存储器

    pointers - 使用 freeRTOS 在 stm32 上随机分配神秘值(A5A5A5A5 和 FFFFFFFF)的指针导致硬故障

    android - 在 Windows 上插入 android usb 时中断

    multithreading - 当线程被调度到不同的 CPU 内核上时,预期的内存语义(例如先读后写)会发生什么?

    multithreading - 超线程/SMT 是一个有缺陷的概念吗?

    c - C中的地址转换

    programming-languages - 硬件编程语言或工具

    c - 在中断中禁用中断是一种好的嵌入式编程习惯吗?

    haskell - 如何使 FFI 调用可中断