gpt4 book ai didi

c++ - IRQ 8 不工作...硬件还是软件?

转载 作者:行者123 更新时间:2023-11-28 06:33:44 25 4
gpt4 key购买 nike

首先,我为 Vintage 计算机组编程。我写的是专门针对 MS-DOS 而不是 Windows 的,因为这是人们正在运行的。我当前的程序是针对更高版本的系统而不是 8086 线,所以计划是使用 IRQ 8。这允许我将二进制值的中断率设置为从 2/秒到 8192/秒(2、4、8、16,等等...)

只是,出于某种原因,在较新的旧系统上(好吧,这听起来很奇怪,)它似乎不起作用。在仿真和我可以访问的 386 系统中,它工作得很好,但在我拥有的 P3 系统(GA-6BXC MB w/P3 800 CPU)上它就是不工作。

代码

设置中断

disable();
oldrtc = getvect(0x70); //Reads the vector for IRQ 8
settvect(0x70,countdown); //Sets the vector for

outportb(0x70,0x8a);
y = inportb(0x71) & 0xf0;
outportb(0x70,0x8a);
outportb(0x71,y | _MRATE_); //Adjustable value, set for 64 interrupts per second

outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y | 0x40);

enable();

在中断结束时

outportb(0x70,0x0c);
inportb(0x71); //Reading the C register resets the interrupt
outportb(0xa0,0x20); //Resets the PIC (turns interrupts back on)
outportb(0x20,0x20); //There are 2 PICs on AT machines and later

关闭程序时

disable();

outportb(0x70,0x8b);
y = inportb(0x71);
outportb(0x70,0x8b);
outportb(0x71,y & 0xbf);
setvect(0x70,oldrtc);

enable();

我在代码中没有看到任何可能导致问题的地方。但这似乎没有意义。虽然我不完全相信这些信息,但 MSD“确实”将 IRQ 8 报告为 RTC 计数器,并表示它存在并且工作正常。有没有可能是后来的系统移动了 vector ?我发现的所有内容都表明 IRQ 8 是 vector 0x70,但中断从未在我的 Pentium III 系统上触发。有什么方法可以查明 vector 是否已更改?

最佳答案

自从我完成任何 MS-DOS 代码以来已经有很长时间了,而且我认为我从未使用过这个特定的中断(我很确定你也可以读取内存位置来获取时间,并且 IRQ0 也可用于每隔一段时间触发您,所以也许这样更好。无论如何,鉴于我的生疏,请原谅我有点链接转储。

http://wiki.osdev.org/Real_Time_Clock该页面的底部有人说他们在某些机器上也遇到了问题。 RBIL 建议这可能是 BIOS 问题:http://www.ctyme.com/intr/rb-7797.htm

如果没有 DOS,我只会捕获 IRQ0 本身并将它们全部重新映射到我自己的中断号并根据需要更改时序。我最近有点这样做了!我认为这在 DOS 上不是个好主意,为此看起来更推荐:http://www.ctyme.com/intr/rb-2443.htm

无论如何,我敢打赌这与 BIOS 相关:

“注意:许多 BIOS 关闭 INT 70h 处理程序中的周期性中断,除非在事件等待中(参见 INT 15/AH=83h,INT 15/AH=86h)。可以通过设置 I 上的位 0 来屏蔽/O 端口 A1h "

关于c++ - IRQ 8 不工作...硬件还是软件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27118766/

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