中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS疑难解答 & 问题讨论 (解答室) » PC系统实模式下的uS级定时解决
作者:
标题: PC系统实模式下的uS级定时解决 上一主题 | 下一主题
郭恒
中级用户




积分 225
发帖 39
注册 2004-10-6
状态 离线
『楼 主』:  PC系统实模式下的uS级定时解决


PC系统的8254的里面有3个有固定用途的计数器,其端口地址为40~43H,其中40H是计数器0的数据口,41H是计数器1的数据口,42H是计数器2的数据口,43H是控制字寄存器。其中
计数器0工作于方式3,16位二进制计数,时钟值为1.1931816Mhz,用于系统计时器日时钟
计数器1工作于方式2,16位二进制计数,时钟值为1.1931816Mhz,用于存贮器定时刷新
  对于方式2或方式3都是减2定时器,若要DELAY 1000uS,即1mS,则计数值wCounter计算如下所示
WORD wMicroSecond = 1000;//单位uS
WORD wCounter= (WORD)(((DWORD)(1.0 * wMicroSecond*1.1931816)) >> 2); //单位计数值

//uS级的DELAY函数,其入口参数是计数值,而不是uS时间值,这样设计是为了避免函数内部的浮点数学运算,提高运行速度。内部没有关中断,用户可根据需要在函数外部关/开中断。采用计数器1,并不是计数器0,是特意安排。


//函数名称: AfxMicroDelay
//入口参数: wCounter:计数值
//返 回 值: 无
void AfxMicroDelay(WORD wCounter)
{
    //读老的计数值
label_Init:;
    asm mov al, 11010010B //计数器1
    asm out 43H, al
    asm in  al,41H
    asm mov ah, al
    asm in  al, 41H
    //asm xchg al, ah
    asm mov  bx, ax

    //赋计数初值,减至为零结束
    asm mov cx, wCounter
label_read:;
    //读当前值
    asm mov al, 11010010B
    asm out 43H, al
    asm in  al,41H

    asm mov ah, al
    asm in  al, 41H
    //asm xchg al, ah
//读计数值直到计数值变化
asm cmp  ax, bx
    asm jz   label_read

    asm mov  bx, ax
    //若CX = 0,计数结束
    asm cmp cx, 0
asm jz label_exit
//将计数减1
    asm dec cx
    asm jmp short label_read
label_exit:;


    return;
}














2004-11-17 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: