操作系统开发系列—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的进程体与此相似。

运行如下:

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

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

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

源码

上一篇:ES2015 中的函数式Mixin


下一篇:springboot整合mybatis的多数据源解决办法