4

我想知道是否可以从 c++ 代码访问处理器中断(我想我需要使用汇编代码)。

事情就是这样。我习惯于使用嵌入式系统(PIC、ARM7 和 Atmel 处理器),我可以毫无问题地编程我的中断(我使用 C)。所有寄存器都已映射,总而言之,这非常容易,具体取决于应用程序。现在我正在使用 x86 和 x64 架构,我希望(强调WANT)能够在这些处理器中做同样的事情。

例如:我想让 C++ 中的一个线程运行一个代码,该代码不断验证当前按下的键,而无需按下回车键(cin、getchar 等)。我想编写一个定时器中断,以便能够在特定时间执行操作。我知道我想做的很多事情都可以通过操作系统来完成,但我真的很想拥有自己做的自由。

目前我正在使用 Linux (Ubuntu),但我肯定会很快使用 Windows,如果这是回答该问题所需的信息

4

2 回答 2

5

对于用户级进程,中断被信号取代。您可以通过调用来安排将信号发送到您的进程setitimer。但最有可能的是,做你想做的事情的最好方法是以下两件事之一:

  1. 使用事件循环。基本上,把你的程序写成一个巨大的循环,定期检查它是否需要做任何事情。在循环中,检查时间,检查按键,等等。做一些你需要做的工作,然后再次循环。

  2. 使用线程。您可以有一个线程来观察时间并触发计时器作业。当数据到达时,您可以让一个线程在 a 上阻塞read以充当中断。

很可能你已经在脑海中钻了出来,你在中断处理程序本身中做的工作很少,通常只是将信息传递给在正常上下文中运行的其他代码。好吧,操作系统已经为您完成了这部分工作。您只需编写等待中断处理程序(或任何需要的)检测并开始处理事件的代码。

我想在 C++ 中有一个线程运行一个代码,该代码不断验证当前按下的键而不按回车键(cin、getchar 等)。

就这样做吧。这需要一个线程,并且需要将终端的输入模式更改为不需要输入键的模式。这与中断无关。

于 2012-08-29T22:24:27.070 回答
0

对于 Windows:

Windows 在隐藏低级硬件访问(如访问 cpu 中断)方面做得很好,原因是 win 内核正在使用它们在进程和其他内部内容之间切换。因此,您需要编写一个驱动程序来直接访问硬件或让您的代码在执行环 < 3(用户模式)中执行。

但是出于教育目的,您可以使用 DOS 甚至 Windows DOS 窗口,甚至可以模拟中断。当然,您将使用一些编译器,例如 Borland C++ 3.x (dos 16bit)。setvect 和 getvect 可用于中断挂钩。

于 2012-08-29T22:29:09.600 回答