我想在函数运行时产生一个中断,然后我想让 CPU 执行一些特定的 ISR,完成 ISR 后,函数将恢复执行。我正在使用 Windows XP 和 MinGW 编译器。
3 回答
实际上没有硬件我想首先以某种方式生成中断并稍后处理它我将在实际硬件上进行
真正的硬件中断将切换 CPU 引脚之一并使其分派到 ISR。我想不出任何真正透明的方式来模仿它。
暂停当前正在运行的函数的一种方法可能是使用SuspendThread 函数,然后使用不同的线程来运行 ISR。
调查的另一种可能性可能是使用Fibers。
编辑
正如cxxl 的回答所建议的那样,另一种可能性是使用实时优先级线程:
- 有两个线程,一个运行你的函数,另一个线程运行模拟的 ISR
- 在两个线程上使用“CPU 亲和性”功能,以确保它们都在同一个 CPU 上运行
- 将 ISR 线程的优先级设置为“实时”
然后,只要您允许 ISR 模拟线程运行,它就会抢占另一个线程。
从此处获取 Windows 驱动程序工具包:http: //msdn.microsoft.com/en-us/library/windows/hardware/gg487428.aspx。它包含用于编写设备驱动程序的头文件和库。如果要处理中断,则需要编写设备驱动程序。
您可以编写设备驱动程序并使用 DPC,这是 ISR 的工作函数。这些 DPC 可以在软件中调用,并且仍然以比任何用户模式代码更高的优先级执行。ISR 本身通常很短,只处理中断、保存数据并将控制权交给 DPC。
我怀疑你可以在 MinGW 中做到这一点,但我猜你需要 MS Visual C,但是有一个免费的 Express Edition。见这里: http: //www.microsoft.com/visualstudio/eng/products/visual-studio-express-products
你确定你需要中断?您可以在具有管理员权限和实时优先级的用户模式下做很多事情......
正如其他人所说,这是一个非常模糊的问题。
一些 CPU 可以通过软件强制/伪造中断,您可以对此进行调查。(我不了解 x86,我是嵌入式开发人员)
在操作系统中,您可能/应该能够用另一个进程/线程中断一个进程/线程。再说一次,我不是 Win 程序员,所以不能这么说。
否则,根据具体情况,您可以运行一些主循环,从中调用您的子例程,并且每次循环它都会检查“中断条件”(无论可能是什么),然后分支或设置一个标志以指示发生了什么事/ 需要发生。