在C/C++中创建应用程序中断

iswrvxsc  于 8个月前  发布在  C/C++
关注(0)|答案(1)|浏览(86)

我正在编写6502模拟器。我需要模拟中断。我将有一个模拟的I/O芯片,轮询键盘,并中断模拟CPU发送中断。
我在Windows上运行,并且知道Windows事件处理程序可以做到这一点,但我想以不依赖于操作系统的方式做到这一点。
我的直觉告诉我,如果没有操作系统的帮助,这是做不到的。这是否只是在我的主循环中进行轮询?我在一台3 GHz的计算机上模拟1 MHz的CPU,所以我想轮询是可以的,但我仍然想知道真实的异步中断。

mwkjh3gx

mwkjh3gx1#

在某种程度上,你确实需要轮询,因为,像现有的几乎所有CPU一样,6502实际上并不完全异步地调用中断处理程序;只在指令之间。因此,在指令周期中的适当时刻,您需要检查VM是否应该接收中断。
一种选择是每次调用操作系统来检查输入。但这可能是过度的开销。即使您的仿真CPU只有1 MHz,每条指令需要5-10个时钟,您也不希望每秒进行200,000次系统调用。
另一种是安排仿真器在异步I/O处理程序或单独的线程中异步接收输入,然后设置仿真代码可以在每个周期测试的原子标志。但是要注意数据竞争和可能的死锁。
标准的C和C++没有真实的实时处理时钟的设施; I/O模型是基于流的。所以,这本质上是依赖于操作系统的,除非您使用为多个特定于操作系统的后端提供公共API的第三方库。

相关问题