zoukankan      html  css  js  c++  java
  • 操作系统开发系列—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的进程体与此相似。

    运行如下:

    源码

  • 相关阅读:
    COM编程入门
    DirectShow Filter 开发典型例子分析 ——字幕叠加 (FilterTitleOverlay)1
    互联网的三大巨头 百度 阿里巴巴 腾讯(BAT)
    入侵Tomcat服务器一次实战
    TinyXML:一个优秀的C++ XML解析器
    Apache POI (JAVA处理Office文档的类库)
    MediaInfo源代码分析 4:Inform()函数
    MediaInfo源代码分析 3:Open()函数
    洛谷 P3905 道路重建
    CF16A Flag
  • 原文地址:https://www.cnblogs.com/joey-hua/p/5492421.html
Copyright © 2011-2022 走看看