C / C ++中断???它们是如何实现/编码的?

时间:2010-09-18 08:02:21

标签: c++ emulation interrupt

之前已经编程过微控制器并且有兴趣尝试构建NES仿真器,我真的想知道如何在C ++中实现中断?

例如,当我在麦克风上讲话或移动鼠标时,程序是如何知道的?它是否经常轮询这些端口?

在模拟硬件设备的中断时(例如,对于NES仿真器),您是否必须不断轮询或有其他方法来执行此操作?

1 个答案:

答案 0 :(得分:6)

这是一个特定于实现的问题,但广泛的说法:通过中断直接访问硬件通常仅限于操作系统(特别是内核)。您的代码在任何现代系统上都不具备此类访问权限。相反,您将使用特定于操作系统的API来访问硬件。

简而言之:桌面操作系统的行为与嵌入式微控制设备不同。

用户输入通常通过称为事件循环的东西在现代系统上处理。您的应用程序执行类似这样的操作,具体实现在操作系统之间有所不同:

int main(int argc, char *argv[]) {
    Event *e = NULL;
    while (e = App::GetNextEvent()) {
        switch (e->getType()) {
        case E_MOUSEUP:
        case E_RIGHTMOUSEDOWN:
        case E_KEYDOWN:
        // etc.
        }
    }

    return EXIT_SUCCESS;
}

在这个例子中,App::GetNextEvent()没有忙等待:它只是坐着并且什么都不做,直到操作系统内部发出事件已经到达的信号。通过这种方式,不需要进行常量轮询,操作系统可以更有效地处理时间片。

然而...... NES不是现代系统;模拟一个意味着您需要模拟NES 的中断和硬件。这样做是一项非常大的工作,与主机操作系统的底层硬件或中断无关。根据现代标准,NES中的6502处理器非常简单;有书可以讨论模仿类似的简单处理器,虽然标题目前让我感到厌烦。

这有帮助吗?