好的,来到第十三天。
第十三天继续优化定时器。首先是合并FIFO缓冲区。这点上次已经提及。不同的timer在中断处理时,把数据都写在一个FIFO里,区分各个timer的就是写入的data。以下是特征图:
后面还会加入任务切换的专用timer,data为2。
为了加快中断处理,我们考虑把中断处理中的移位处理去掉,可是怎么去呢?当各个timer是以顺序表的结构存在时,每当一个timer超时,管理剩下的timer就必须移位。那怎么办?解决方法应该从数据结构入手。我们知道,顺序表的数据结构的优点是可以随机地插入,但缺点就是插入和删除很复杂。而链表的则插入和删除非常便利。并且此处timer的增删不是固定的顺序,而是需要挨个比较超时时间,所以这里顺序表的结构没有优势,此处换成链表。插入节点的原理图如下:
接下来,作者用了一个小技巧,并将其称为“哨兵”。说的是,在timer_settime的函数中,我们必须考虑到timer有可能出现以下四种情况:
针对这四种情况要有不同的处理方法,显得很麻烦。那我们如何将其精简?可以设置一个时间长近乎无穷大的timer,那就可以省掉第一种和最后一种情况的讨论。于是进一步提高了程序的速度。
今天的内容不多,收工!