|
整个超时机制的关键之 超时计时器
接着上面提到的 超时计时器要做的三件事。
1.新数据到来之间,不断累加。
这里只有一个问题:
在哪里累加?
也许习惯性地,你会非常自然地想到。既然是定时器,肯定是要放在 定时器中断 里啊。
为什么呢?
因为这样准时啊?
为什么要准时?
——说实话,但我问自己问到这里的时候,我都被问倒了。
然而,几经思考(当然是以前),我找到了一个更加完整更加确切的理由:
1.放在定时器中断里,实际上并不是为了追求准时——我们说过,串口接收是一个实时性,精确性要求不高很一般的任务。
2.确切的说,放在中断里的目的是为了让这个定时器判断的更加均匀。
换个角度来说,假如我们放在main主线程里,或其他更加重要的或者确切需要用到的线程里的话。
会出现什么情况?
main函数总是不断变化的,随着越来越多的函数被调用,任务被执行。这个main的循环周期不断变化,也许三天前我们的循环周期是1ms,结果,现在就变成了3ms
当然,我们说了,重点不在于精确性,重点在于 均匀性和稳定性。
如果有一天我们的循环周期变成了30ms.那么,这个时候我们要判断一组数据串接收完毕就至少要30ms.
而这显然并不合理。但我们没有办法把这个时间设置的更低,仅仅是因为main的循环周期就有30ms......
此外,对于我们调定的时间,我们在程序开发的过程里,必然少不了要根据main循环周期的变化而调整这个延迟数值。
这就带来了风险和麻烦。
因此,我们一般把定时器放在定时中断里累加。
也因此,这个定时器必须具有静态特性,也就是说,它必须永远保持存储的值。
这里要先提一点:
任何时候,我们讨论一个方法的时候,会最终选择一个最恰当的方案,但这并不代表其他方案就永远不能被选中。
因为,后面在考虑到如何调用这个超时机制的时候,我意识到,因为这个要放在定时器中断里的 计时器,使得我们的用户接口略显复杂。
于是这个时候我们会认为,对于一些程序任务稀少,简单的,实时性要求不高的系统,我们完全可以不把定时器放到一个均匀的定时中断里去。
当然,这是后话,这里提一下就可以。
我只是想让你知道。
我们曾经有过不止一个选择。而我们除了选择放在中断里还有另外一个或者几个其他方案备用。它们在某些时候也许会很方便,不要忘了他们,以便你需要的时候可以灵活选择。 |
|