[第13天]定时器优化

      强迫症改不了,本来想好12,13天一块写掉,因为能记录的内容不多,但这样总感觉不舒服。所以还是分开写了。

      今天是定时器的优化,为什么要优化呢?这跟处理鼠标和键盘数据的道理是一样的。定时器会触发一个中断,而处理中断的时候CPU不能做其他的事情。所以要加快中断处理。因为之前的是char类型的FIFO,在时间处理上不太够,因此重写使用int类型的FIFO32。

优化思路:

  • 定时器链表:因为每个定时器都有一个超时时间,只要按超时的早晚顺序把这些定时器链接起来即可,每次只要看看第一个定时器有没有超时即可。
  • 哨兵:这是为了简化程序,哨兵是链表经常使用的技术。在这里,是设置一个永远不会超时的定时器,实际上就是0xffffffff。由于这个的存在,实际上这个操作系统在经历 (0xffffffff/中断频率) 秒后就会失效。

      所以得出的中断处理的代码如下。其他代码见github

疑问:

      我就想不通,为什么不是每次中断然后把这个中断信息存到FIFO里,然后在主程序里处理呢?这就是处理鼠标和键盘数据时的做法。直到第16天,我才恍然大悟,确实定时器是特别的。因为定时器涉及到任务切换。仔细想想,如果我是多任务的,然后定时器的数据都由主任务处理,那么在执行其他任务的时候就不能处理定时器了,就再也不能任务切换了。但也可以每个任务都处理相同的定时器,这得多麻烦。所以在中断时直接处理是合理的,而且直接导致后面的任务切换也在inthandler20里。妙及了。

性能:

      作者是通过计数来测试性能的。作者的电脑是有多老,我的计数结果差不多是其百千倍。。所以看看结果如何。

couter4