改写了8254后如何得到正确的系统时钟

dsangvei 2002-08-29 04:07:08
我将8254的计数器0改为1192,即每毫秒中断一次,在DOS下测试之后发现,
系统时钟也变得很快了,应该如何做才能得到正确的系统时钟?
...全文
73 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsangvei 2002-09-04
  • 打赏
  • 举报
回复
我忘了写0x20到0x20了。
dsangvei 2002-09-03
  • 打赏
  • 举报
回复
#include <dos>
#include <conio>
#include <iostream>
#include <stdio>
#include <time.h>

//int IntNo=0x1C;
int IntNo=8;
char *pText=(char*) TEXTAddr;
int count=0;
void (__interrupt __far *prev_int_1c)();
int SysTime=0;
void __interrupt __far timer_rtn()
{
_disable();
++count;
SysTime++;
if (SysTime>55) //continue on the old intr . 18 times/s
{

SysTime=0;
_chain_intr( prev_int_1c );
}
_enable();
}

void main()
{


prev_int_1c = _dos_getvect( IntNo );
_dos_setvect( IntNo, timer_rtn );

int Ts=*(Tmp);
clock_t tcc=clock();

_disable();
outp( 0x43, 0x34 );
//1000*1192 04a8
outp( 0x40, 0xa8 ); //low
outp( 0x40, 0x04 ); //high
_enable();

getch();

int Te=*(Tmp)-Ts;
cout <<"Tt " << tt << endl;
cout <<"Time count " << Te << endl;
cout << "count " << count << " --- " << count *55 <<" ms " << endl;
cout << "clock count " << (clock()-tcc)*10 << " ms " << endl;

_disable();
outp( 0x43, 0x34 );
//65535
outp( 0x40, 0 ); //low
outp( 0x40, 0 ); //high
//restore old intr
_dos_setvect( IntNo, prev_int_1c );
_enable();

getch();

}
dsangvei 2002-09-03
  • 打赏
  • 举报
回复
这个容易做到。
但是,0X046C中的值也会变,我改都改不过来。
跟踪了一下,是INT 08H 修改的,但是,在INT 08H中
是每次中断都必定响应的,在里面想做修改的话就会死机的。
blh 2002-09-03
  • 打赏
  • 举报
回复
有什么麻烦的,转换是在内存中完成的,用不了你几个cpu时钟
dsangvei 2002-09-03
  • 打赏
  • 举报
回复
不能更改INT 08H,会死机的。
INT 1CH倒可以,那是用户时钟程序。
我用clock()返回的ticks,也多了55倍。
完了,我找不到怎么办才好了!
dsangvei 2002-09-02
  • 打赏
  • 举报
回复
当然,我在程序中可以做到每1000ms改写系统时间一次,将它恢复到正确的值。不过,这样是不是太麻烦了一点?我并不知道系统是如何修改时钟的?有人知道吗?
bailingke 2002-09-01
  • 打赏
  • 举报
回复
哦,是吗?关注!
blh 2002-08-31
  • 打赏
  • 举报
回复
好像系统是中也是依靠8254工作的,你改变了它,系统是中也就改变了。根据你修改的值重新修正你读出的系统时钟的值
dsangvei 2002-08-30
  • 打赏
  • 举报
回复
我的程序就是在保护模式下运行的。我读入046CH 中的值,在WIN98下,它仍然为每秒18次,但在纯DOS下,就为1000次,我将以前的中断地址保存下来,每55毫秒执行一次,这个数据仍是1000。好像它绕过了我的中断程序。
bailingke 2002-08-29
  • 打赏
  • 举报
回复
你先将dos的程序保存好

在自己的程序中改8254

当退出回到dos后,再改回来即可

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧