码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-05-14 15:19:28      阅读:160      评论:0      收藏:0      [点我收藏+]

标签:

计数器的工作原理是这样的:它有一个输入频率,在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.延时操作

标签:

原文地址:http://www.cnblogs.com/joey-hua/p/5492421.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!