在可编程间隔定时器(8254)上的计数器到期之前重新启动计数器

时间:2014-03-10 14:48:38

标签: c assembly x86

我正在用C和汇编编写一个抢占式内核。我一直在通过PIT和PIC查看并设置定时器中断,但有一件事我完全无法找到答案。

我们已经启动8254芯片在模式2中对计数器0进行计数。我们将其设置为每隔10 ms在PIC上的IR0上发出一个中断。之后,我们在PIC上启用IR0,事情按预期工作。

但是,假设在某些条件下,我们希望通过为它提供一个新值来改变PIT触发的时间。或者只是重启计数器midcounting。

芯片的intel手册在门上有一些细节,并通过在门上获得上升沿来重启计数器。

本手册还说,如果我们给计数器一个新值,它就不会复位计数器,直到当前计数序列结束后,除非在计数结束之前发生触发(门上的上升沿)。

本手册还说,向芯片发送新的CW会重置计数器,但我不相信这是重启或改变计数器的最佳方式。

所以问题是,如何在c或汇编中完成? (我们随时可以获得完全写入权限)。

1 个答案:

答案 0 :(得分:0)

不要回答一个问题,因为我有点回答,我会自己回答。

据我所知,芯片有3个计数器,但只有计数器2(我们从0开始计数)连接了栅极引脚(这个引脚连接到扬声器)。结果,作为实时定时器计数器的计数器0在门上没有连接,这意味着在发送新值后我们不能在其上引发触发。

这意味着如果没有发送新的ICW,就不可能在计时器启动之前向其发送值然后重新启动它。

如果我们想要在我们退出由8254芯片引起的中断时重置定时器,8254芯片是在处理该中断时结束的(即我们不希望时间是在实际中断期间运行)我们最好将模式更改为模式0,它不会在终端计数上重新启动计时器,然后只需手动重新启动它,我们每次要结束时都要使用它中断。