Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在可编程间隔计时器(8254)上计数器过期之前重新启动计数器_C_Assembly_X86 - Fatal编程技术网

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

C 在可编程间隔计时器(8254)上计数器过期之前重新启动计数器,c,assembly,x86,C,Assembly,X86,我正在用C和汇编语言编写一个抢占式内核。我一直在看和设置定时器中断通过坑和图片,但有一件事我完全无法找到答案 我们已初始化8254芯片,使其在模式2中计数计数器0。我们将其设置为每隔10毫秒在PIC上的IR0上触发一次中断。之后,我们在PIC上启用IR0,事情按预期工作 然而,让我们假设在某些条件下,我们希望通过提供一个新的值来改变矿坑点火的时间。或者只需重新启动计数器中期计数 英特尔芯片手册中有一些关于栅极的细节,并使用它通过在栅极上获得上升沿来重新启动计数器 手册还说,如果我们给计数器一个新

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

我们已初始化8254芯片,使其在模式2中计数计数器0。我们将其设置为每隔10毫秒在PIC上的IR0上触发一次中断。之后,我们在PIC上启用IR0,事情按预期工作

然而,让我们假设在某些条件下,我们希望通过提供一个新的值来改变矿坑点火的时间。或者只需重新启动计数器中期计数

英特尔芯片手册中有一些关于栅极的细节,并使用它通过在栅极上获得上升沿来重新启动计数器

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

手册还说,向芯片发送新的CW将重置计数器,但我不认为这是重新启动或更改计数器的最佳方式


所以问题是,在c或汇编语言中如何实现这一点?(我们可以随时获得完全的写访问权限)

不要留下一个没有答案的问题,因为我有一些答案,我会自己回答

据我所知,芯片有3个计数器,但只有计数器2(我们从0开始计数)连接了门引脚(这一个连接到扬声器)。因此,计数器0(真正的计时器计数器)在门上没有连接,这意味着我们不能在发送新值后触发它

这意味着,如果不向其发送新的ICW,则不可能向其发送一个值,然后在计时器启动之前重新启动该值


如果我们想在8254在中断处理结束时连接到的8259芯片导致中断时重置计时器(也就是说,我们不希望时间在实际中断期间运行)我们最好将模式更改为模式0,该模式不会在终端计数时重新启动计时器,然后在每次即将结束和中断时,按照我们想要的时间手动重新启动计时器。

如果我没有记错,在设置周期性中断时,8254必须复位,以便在其处于周期中间时更改计数器。这真的需要吗?另一个问题是中断与计数器的可读值有点不同步(如果它接近中断边界,通常的修复方法是重新读取计数器)。@rcgldr如果我理解正确,您不需要重置整个8254,因为您可以使用新的CW重置其3个计时器中的一个,但这不是最佳的afaik。然而,手册确实指出,如果计数器在栅极引脚上获得上升沿,则计数器将从下一个CLK脉冲的初始值开始。这同样适用于从新值开始计数,如果栅极引脚获得上升沿,则应在下一个CLK脉冲上从新值开始计数。因此,这在不重置的情况下应该是可行的。