30天自制操作系统day12

这一章讲如何使用定时器。

定时器硬件与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。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值