C 在可编程间隔计时器(8254)上计数器过期之前重新启动计数器
我正在用C和汇编语言编写一个抢占式内核。我一直在看和设置定时器中断通过坑和图片,但有一件事我完全无法找到答案 我们已初始化8254芯片,使其在模式2中计数计数器0。我们将其设置为每隔10毫秒在PIC上的IR0上触发一次中断。之后,我们在PIC上启用IR0,事情按预期工作 然而,让我们假设在某些条件下,我们希望通过提供一个新的值来改变矿坑点火的时间。或者只需重新启动计数器中期计数 英特尔芯片手册中有一些关于栅极的细节,并使用它通过在栅极上获得上升沿来重新启动计数器 手册还说,如果我们给计数器一个新值,它不会重置计数器,直到当前计数序列完成后,除非在计数结束前发生触发器(门上的上升沿) 手册还说,向芯片发送新的CW将重置计数器,但我不认为这是重新启动或更改计数器的最佳方式C 在可编程间隔计时器(8254)上计数器过期之前重新启动计数器,c,assembly,x86,C,Assembly,X86,我正在用C和汇编语言编写一个抢占式内核。我一直在看和设置定时器中断通过坑和图片,但有一件事我完全无法找到答案 我们已初始化8254芯片,使其在模式2中计数计数器0。我们将其设置为每隔10毫秒在PIC上的IR0上触发一次中断。之后,我们在PIC上启用IR0,事情按预期工作 然而,让我们假设在某些条件下,我们希望通过提供一个新的值来改变矿坑点火的时间。或者只需重新启动计数器中期计数 英特尔芯片手册中有一些关于栅极的细节,并使用它通过在栅极上获得上升沿来重新启动计数器 手册还说,如果我们给计数器一个新
所以问题是,在c或汇编语言中如何实现这一点?(我们可以随时获得完全的写访问权限) 不要留下一个没有答案的问题,因为我有一些答案,我会自己回答 据我所知,芯片有3个计数器,但只有计数器2(我们从0开始计数)连接了门引脚(这一个连接到扬声器)。因此,计数器0(真正的计时器计数器)在门上没有连接,这意味着我们不能在发送新值后触发它 这意味着,如果不向其发送新的ICW,则不可能向其发送一个值,然后在计时器启动之前重新启动该值
如果我们想在8254在中断处理结束时连接到的8259芯片导致中断时重置计时器(也就是说,我们不希望时间在实际中断期间运行)我们最好将模式更改为模式0,该模式不会在终端计数时重新启动计时器,然后在每次即将结束和中断时,按照我们想要的时间手动重新启动计时器。如果我没有记错,在设置周期性中断时,8254必须复位,以便在其处于周期中间时更改计数器。这真的需要吗?另一个问题是中断与计数器的可读值有点不同步(如果它接近中断边界,通常的修复方法是重新读取计数器)。@rcgldr如果我理解正确,您不需要重置整个8254,因为您可以使用新的CW重置其3个计时器中的一个,但这不是最佳的afaik。然而,手册确实指出,如果计数器在栅极引脚上获得上升沿,则计数器将从下一个CLK脉冲的初始值开始。这同样适用于从新值开始计数,如果栅极引脚获得上升沿,则应在下一个CLK脉冲上从新值开始计数。因此,这在不重置的情况下应该是可行的。