gpt4 book ai didi

c - 在 Windows 上安装定时器/时钟 ISR - 单线程环境中的异步调用

转载 作者:可可西里 更新时间:2023-11-01 10:27:18 29 4
gpt4 key购买 nike

我正在改进一些代码,这些代码模拟了 x86 Windows 系统上的上下文切换调度程序。该程序使用一些古老的 Borland C 编译器在 Windows XP(编辑:可能不是 Windows 7)上编译,并且正在移植为 MSVC 可编译。

有一次,代码通过 dos.h 中的这些不可用函数安装 ISR:

void (*)() getvect(int)
void setvect(int, void (*)());

具体来说,代码为(循环)定时器中断安装了一个 ISR。这些电话是:

tick_isr_old = getvect(0x08);
setvect(0xF2, tick_isr_old);
setvect(0x08, (void interrupt (*)(void)) tick_isr);
setvect(0xF1, (void interrupt (*)(void)) context_switch_isr);

有没有人知道什么是设置这些 ISR 的合理方法(也许使用 Windows API?)。更糟糕的是,这些功能是用汇编语言实现的(毕竟它们需要执行上下文切换......)。至少有任何文档可以引用整数常量(0x08、0xF2、0xF1)的中断 vector 吗? Google 并没有真正提出我可以使用的东西。


更新:由于显然不可能在 Windows 7 中运行这些 DOS 调用,我需要一种在通常的单线程环境中异步调用函数的方法。

在 linux 下,signal()raise() 函数可以执行此操作,但在 Windows 下,它们仅以尽可能少的方式受支持。有没有办法在 Windows 下实现?

最佳答案

您肯定需要替换 tick_isr 和 context_switch_isr,因为它们正在为 DOS 环境实现上下文切换。现有代码无法在 Windows 中执行任何有意义的操作,即使您可以明智地执行它也是如此。

由于在原始代码中,上下文切换是抢占式的,因此您可以完全消除该逻辑并改用 Windows 线程。推测现有代码有一些用于创建和删除上下文的例程,这些可以用相应的 Windows API 线程函数替换。

如果您需要确保一次只有一个线程在运行,您可以使用SetProcessAffinityMask。将进程绑定(bind)到单个 CPU。

或者,您可以使用调试功能 GetThreadContextSetThreadContext实现你自己的上下文切换。在这种情况下,您将有一个线程用于主程序代码,另一个线程运行上下文切换器。

关于c - 在 Windows 上安装定时器/时钟 ISR - 单线程环境中的异步调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11870152/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com