• 操作系统开发系列—13.h.延时操作


    计数器的工作原理是这样的:它有一个输入频率,在PC上是1193180HZ。在每一个时钟周期(CLK cycle),计数器值会减1,当减到0时,就会触发一个输出。由于计数器是16位的,所以最大值是65535,因此,默认的时钟中断的发生频率就是1193180/65536约等于18.2HZ。

    我们可以通过编程来控制8253.因为如果改变计数器的计数值,那么中断产生的时间间隔也就相应改变了。

    比如,如果想让系统每10ms产生一次中断,也就是让输出频率为100HZ,那么需要为计数器赋值为1193180/100约等于11931.

    。。。

    写模式

    。。。

    通过修改,我们已经把两次时钟中断的间隔改成了10ms。原来一秒钟18.2次中断,大约55ms发生一次,现在一秒钟100次,10ms发生一次。

    现在我们可以编写新的延迟函数了,因为中断10ms发生一次,所以ticks也是10ms增加一次,延迟函数可以这样来写,clock.c:

    PUBLIC void milli_delay(int milli_sec)
    {
            int t = get_ticks();
    
            while(((get_ticks() - t) * 1000 / HZ) < milli_sec) {}
    }
    

     函数一开始得到当前的ticks值,然后开始循环,每次循环的时候看已经过去了多少ticks(假设是Δt个)。因为ticks之间的间隔时间是(1000/HZ)ms,所以Δt个ticks相当于(Δt*1000/HZ)ms,循环会在这个毫秒数大于要求的毫秒数时退出。

    接下来修改进程A的进程体:

    void TestA()
    {
    	int i = 0;
    	while (1) {
    		disp_str("A");
    		disp_int(get_ticks());
    		disp_str(".");
    		milli_delay(1000);
    	}
    }
    

    同时让进程B和C的进程体与此相似。

    运行如下:

    源码

  • 相关阅读:
    eclipse中常用快捷键
    js sort排序
    js parseInt函数
    Jquery常用方法
    jquery的call()和apply()方法
    Jquery中的事件命名机制
    CSS层叠样式表
    推荐博客园中好的博客主
    页面刷新或者子窗体刷新父窗体,不提示 "重试或取消”对话框
    FullCalendar日历插件使用说明
  • 原文地址:https://www.cnblogs.com/joey-hua/p/5492421.html
Copyright © 2020-2023  润新知