这一章讲如何使用定时器。
定时器硬件与IRQ0连接,中断会触发IRQ0的处理函数。初始化的方法是写入分频数(0-65535),如果写入0表示分频66536。最终获得的定时器周期为主频/分频数。
写好中断函数,在初始化时enable,就能实现计时功能了。
之后又实现了一个超时(timeout)功能,也就是定时器计时到某一时刻触发一个事件。这里完全是软件实现的。为timeout设置一个FIFO,定时器超时之后向FIFO写入。在主程序中采取轮询方式检测FIFO的状态(方法同键盘鼠标的处理),检测到有数据时,触发timeout处理函数。
之后扩展到多个定时器。方法是在TIMERCTL结构中放一个TIMER结构的数组。每个TIMER有独立的timeout,FIFO等。每次定时器中断把使用的TIMER都更新。
由于每次中断都要判断所有定时器的timeout条件,会花费很多时间。接下来对定时器中断进行了改进:
- 改进前,每次中断都需要把每个定时器的timeout-1,当timeout==0时触发处理函数。改为每次只和一个全局的count比较。当count达到某一个timeout时触发相应的事件。
- 减少每个中断中循环的次数。方法是,在启动timer的函数(timer_settime)中,将timer放到另一个数组中,并且按照timeout值排序。每次中断时,只判断第一个timer的超时条件。timer超时后,将它从这个数组中删除,下一次仍判断第一个timer,也就是会最先超时的timer。