65.9K
CodeProject 正在变化。 阅读更多。
Home

在不使用内置函数的情况下获取系统时间(可用于 Turbo C++)

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.11/5 (14投票s)

2004年10月6日

2分钟阅读

viewsIcon

71250

downloadIcon

640

在不使用内置系统调用的情况下获取系统计时器

引言

你们可能都使用过 CTimeCTimeSpan 来操作系统计时器。本文将向您展示系统计时器的工作原理。我将向您介绍系统时钟操作背后的端口通信。那些对硬件和软件接口实践略有偏见的人会发现这篇文章非常有帮助。

关于基本例程

那些阅读过 conio.h 头文件的人会发现两个有趣的函数,_outp()_inp()。我将详细解释每个函数。

  • _outp:这是一个用于向端口发送数据的函数。该函数将一个字节发送到指定的端口。该函数的语法是 int _outp(unsigned short port, int databyte)。该函数返回已发送的数据。
  • _inp:这是一个用于从端口接收数据的函数。该函数从指定的端口读取一个字节。该函数返回从端口读取的数据。该函数的语法是:_inp(unsigned port)

为了获取系统时钟,我们首先应该初始化计时器。这是通过命令完成的:_outp(0x70,0x95); 端口号 0x70 被保留给系统时钟。然后当前时间信息将存储在端口 0x71(内存地址)中。如果您发送数据 0x10,则地址 0x71 的内容将是计时器的秒值。如果您发送数据 0x02,则地址 0x71 的内容将是计时器的分钟值。如果您发送数据 0x04,则地址 0x71 的内容将是计时器的小时值。就这样... 系统时钟操作围绕这两个基本函数展开。这些函数对于编写设备驱动程序的人很有用。

代码解释

我正在一个名为 CBaseTime 的类中实现整个过程。您可以在 BaseTime.hBaseTime.cpp 中找到该过程的封装。

// Constructor: Indirectly initializes the clock. 
CBaseTime::CBaseTime() 
{ 
	_outp(0x70,0x95); 
} 

// Get current time CString 
CBaseTime::GetCurrentTime() 
{ 
	CString curTime; 
	_outp(0x70,0x10); 
	seconds = _inp(0x71); 
	_outp(0x70,0x02); 
	minutes = _inp(0x71);
	_outp(0x70,0x04); 
	hours = _inp(0x71); 
	curTime.Format("%x:%x:%x",hours,minutes,seconds); return curTime; 
} 

// Get current hours 
CString CBaseTime::GetCurrentHours() 
{ 
	CString retHours; 
	_outp(0x70,0x04); 
	hours = _inp(0x71); 
	retHours.Format("%x",hours); 
	return retHours; 
} 

// Get current minutes 
CString CBaseTime::GetCurrentMinutes() 
{ 
	CString retMins; 
	minutes = _inp(0x71); 
	_outp(0x70,0x02); 
	retMins.Format("%x",minutes); 
	return retMins; 
} 

// Get current seconds 
CString CBaseTime::GetCurrentSeconds() 
{ 
	CString retSecs; 
	seconds = _inp(0x71); 
	_outp(0x70,0x04); 
	retSecs.Format("%x",seconds); 
	return retSecs; 
}

许可证

本文未附加明确的许可证,但可能在文章文本或下载文件本身中包含使用条款。如有疑问,请通过下面的讨论区联系作者。

作者可能使用的许可证列表可以在此处找到。

© . All rights reserved.