《30天自制操作系统》学习笔记——第十二天

来源:互联网 发布:清华大学网络教育本科 编辑:程序博客网 时间:2024/05/03 12:51

        好的,来进入今天的新内容吧!

                                                   

       今天的内容是定时器。什么是定时器呢?就从功能上来说,其实很简单,就好像微波炉一样,你设定一个时间,然后从现在开始计时,到那个时间的时候提醒你。那我们要这样的功能干什么呢?可以实现鼠标的光标闪烁。有没有高级一点的?有,而且至关重要,在后面会讲到,那就是多任务。多任务的原理就是把时间分成一个个小小的时间片,这个具体以后再讲。所以知道了这个,我们就会发现定时器很重要。

       要在电脑中管理定时器,其实就是对PIT的设定。PIT是“Proguramable Interval Timer”,可编程的间隔型定时器。PIT连着IRQ0,设定的时间超时了以后,就会触发中断。等一下,好像在学汇编的时候也有一个关于时间的芯片,对,那就是CMOS RAM。其实那个是用来记录实时时钟的,跟这个定时器不太一样。区别就好像你家的钟表和秒表的区别。CMOS的端口地址为70h地址端口,71h数据端口。这里我们用到的芯片是8254。书上没有讲太仔细。我们在这里补充一点关于8254的内容,因为这学期单片机的学习也会有学到:

                        

       资料来自百度文库:点击打开链接

       控制字如下:

                                

        所以往43h端口写入34h就是计数器00,长度为先低后高两个字节,以方式2进行二进制计数

        往40h端口写入的是中断周期,此处写入的数值指的是多少个时钟周期。由于芯片时钟频率已知,是1193.18KHZ,那么中断频率就是时钟频率/设定的数。当设定数是11932时,中断频率为100HZ,即中断周期为10ms。

       具体的关于8254芯片的内容讲到这里,以后再用到的话可以参考刚才链接上的ppt,讲的很清楚了已经。

设定完之后,每过10ms,IRQ0就会发来一个中断请求。

       接下来就该编写中断处理程序了。也就是inthandler20(int  *esp)。一开始的中断处理程序,我们是这样处理的,设一个timeout,也就是要设定的超时时间。比如我们想要设10秒,那就应该在此处设为1000(*10ms)。然后每次中断请求来以后,timeout--,然后判断是否已经为0,若是0,则已经超时,向fifo里发送超时的标志数据data。

       顺利实现!接下来设定多个定时器。一开始作者给每个定时器分配一个独立的fifo,但这样速度很慢,而且判断的语句显得非常复杂,于是作者马上做了改动,将fifo归到一起,不同的定时器,由标志数据data不一样来判断是哪个定时器超时。为了再次加快中断处理,作者引入了count。把设定时间用timeout表示,count从零开始,每次中断,count++。把减法换成加法,节省了时间。继续加快中断处理,原来每有一个时钟超时都需要执行500次判断,现在引入next,即下一个要来的时刻。每次超时后,也做一个循环判断,确定next。

       为了进一步提高中断处理的速度,作者引入了类似图层管理信息的定时器管理信息:TIMERCTL。其中,intusing 代表现有的时钟的个数,这样就可以不再循环500次。这里时钟的管理结构,还是队列型的。在下一讲,会把这种结构做成链表型的,为什么要做成链表呢?咱们明天再叙!

0 0
原创粉丝点击