英创工控主板产品,大多数都应用于连续工作的工业环境中,对实时时钟有普遍的需求。由于RTC晶体总是有一定误差的,我们控制的精度为+/-10ppm,对长期运行的设备就需要在线自动校时功能。我们可以利用标准的SNTP协议来实现这个功能。
在Windows CE中校时功能是作为标准服务,由service.exe来管理运行的。对应用程序来说,只需要执行下面的简短代码,就可实现SNTP的对时功能:
WCHAR szControlString[] = L'sync';
DWORD dwLenIn = sizeof(szControlString);
HANDLE hFile = CreateFile(L'NTP0:', GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING,0,NULL);
if(INVALID_HANDLE_VALUE == hFile)
{
printf('Open NTP0: failed\r\n');
return 0;
}
//执行时间同步操作
DeviceIoControl(hFile, IOCTL_SERVICE_CONTROL, szControlString, dwLenIn, NULL, 0, NULL, NULL);
CloseHandle(hFile);
如果客户直接引用上述代码在现有的主板上运行,发现对时不成功。这主要是由于微软发布的缺省release版的timesvc.dll似乎有些问题,需要重新build之后才能有效。我们会在5.1之后的标准版中增加SNTP校时功能。对先前已购买的客户,若需要使用SNTP校时功能,可与我们联系,以更新内核。
SNTP还有一组注册表,在使用前可能需要关注一下。
[HKEY_LOCAL_MACHINE\Services\Timesvc]
'AutoUpdate'=dword:0
'ClientOnly'=dword:1
'AutoDST'=dword:0 ; auto Daylight Saving Time
'Trustlocalclock'=dword:0 ;只能为0
'Refresh'=dword:48190800 ; 2 weeks
'RecoveryRefresh'=dword:1B7740 ; 30 minutes
'Threshold'=dword:5265C00 ; 1 day
'Server'='pool.ntp.org'
注册表中的各项参数都可在msdn中找到解释,所以只对特殊的情况进行简要说明。“Server”指定的是网上的SNTP服务器,根据实际应用,也可以改成ip地址。注意使用URL时,需要在userinfo.txt中配置好DNS服务器的ip。如果AutoUpdate设置为1,每次系统上电复位启动时,都会自动进行一次SNTP校时。Timesvc下还有一些参数没有列出,哪些参数是完全不能改的。
全部0条评论
快来发表一下你的评论吧 !