VxWorks for x86系统中实时时钟的应用
0引言
VxWorks是美国WRS(Wind River System)公司推出的一个具有微内核、可裁剪的高性能强实时操作系统,该实时操作系统在航空、广播、运输、医疗、自动化生产和科学研究等领域中有着广泛的应用,尤其是在国防和军事上的一些高精尖技术及实时性要求极高的领域中,就更体现出了其优越的性能。
X86或80X86是Intel公司开发的微处理器体系结构的泛称。采用X86架构的Intel CPU及其兼容CPU都使用X86指令集,作为个人计算机的标准平台,它们构成了当今数量最大的CPU阵营。VxWorks可支持多种不同体系结构的32位CPU,其中就包括现在使用最为广泛的X86系列CPU。
1 VxWorks for x86系统中的系统时间
我们知道,在VxWorks for x86系统中没有直接读取RTC(实时时钟控制器)的函数,在目标板每次加电或重启后,用time.h中的函数第一次读到的时间始终是“THU JAN 01 00:00:00 1970”。这里取到的系统时间是从开机到现在的时间,也就是说,VxWorks的系统日期和时间是相对于一个基准的日期时间计算出来的,这一基准时间就是“THU JAN O1 00:00:00 1970”,其他日期时间对系统来说都是相对于这一基准时间已经过的秒数。因此,这样取到的系统时间是没有任何使用价值的。
然而,在实际应用中,我们经常需要用到“真实的”VxWorks系统时间,比如在文件系统中创建文件时,我们就希望文件创建的时间是实时时钟的时间,同时在日志文件中记录的时间也希望是实时时钟的时间。但是,在文件系统中能直接访问的却是上述那个“没有使用价值的”系统时间。这种情况就为应用带来了很大的不便。
为了获得一个有实际使用价值的系统时间,我们就需要系统时间能与目标板的实时时钟保持同步。
实际上。在VxWorks for x86系列的机器中,可以通过读写特定的端口来读取/设置保存在BIOS中的实时时钟。
2 VxWorks for x86中系统时间和实时时钟的同步
使用VxWorks的ansiTime库(time.h)中的time()函数可以读取当前秒钟形式的日历时间,也就是系统加电后相对于基准时间所经过的秒数;使用locatime ()函数则可以将此日历时间转换成tm型结构的日期和时间;之后,再使用asctime()函数可将tm型结构的日期和时间转换成包含日期和时间的字符串。
使用以上这些函数可以编写一个显示当前系统时间的函数GetSysTime(),其内容如下:
系统加电后,调用GetSysTime (函数,其显示内容为“time is:THU JAN 01 00:00:00 1970”。而在实际应用中,通常希望获取保存在BIOS中的实时时钟,并使用这个实时时钟来设置系统时间,从而使系统时间与实时时钟保持同步。因此,在VxWorks for x86系统中,可以通过读写端口0x70,0x71来访问BIOS中的实时时钟。其中,端口地址0x70对应的是实时时钟的索引寄存器(表1所列是实时时钟索引寄存器的定义),端口地址0x71对应的是实时时钟的数据寄存器。实时时钟的秒、分、时,日、月、年在索引寄存器中的存放地址分别是0x00、0x02、0x04,0x07、0x08、0x09。
需要注意的是,从端口中读到的数据,其格式为BCD码,因此在使用前还需要将其转换为十进制数。
在把转换后的实时时钟的秒、分、时,日、月、年等数据赋给tm型结构变量的相应成员后,可使用ansiTime库(time.h)中的mktime ()函数将tm型结构的日期和时间转换成秒钟形式的日历时间,并烙其赋给timespec型结构变量的tv-sec成员(timespec型结构的tv_nsec成员可设置为0),这样,通过使用clockLjb库中的clock_settime()函数就可以将系统时间设置为实时时钟的时间,从而实现系统时间与实时时钟同步。
VxWorks是美国WRS(Wind River System)公司推出的一个具有微内核、可裁剪的高性能强实时操作系统,该实时操作系统在航空、广播、运输、医疗、自动化生产和科学研究等领域中有着广泛的应用,尤其是在国防和军事上的一些高精尖技术及实时性要求极高的领域中,就更体现出了其优越的性能。
X86或80X86是Intel公司开发的微处理器体系结构的泛称。采用X86架构的Intel CPU及其兼容CPU都使用X86指令集,作为个人计算机的标准平台,它们构成了当今数量最大的CPU阵营。VxWorks可支持多种不同体系结构的32位CPU,其中就包括现在使用最为广泛的X86系列CPU。
1 VxWorks for x86系统中的系统时间
我们知道,在VxWorks for x86系统中没有直接读取RTC(实时时钟控制器)的函数,在目标板每次加电或重启后,用time.h中的函数第一次读到的时间始终是“THU JAN 01 00:00:00 1970”。这里取到的系统时间是从开机到现在的时间,也就是说,VxWorks的系统日期和时间是相对于一个基准的日期时间计算出来的,这一基准时间就是“THU JAN O1 00:00:00 1970”,其他日期时间对系统来说都是相对于这一基准时间已经过的秒数。因此,这样取到的系统时间是没有任何使用价值的。
然而,在实际应用中,我们经常需要用到“真实的”VxWorks系统时间,比如在文件系统中创建文件时,我们就希望文件创建的时间是实时时钟的时间,同时在日志文件中记录的时间也希望是实时时钟的时间。但是,在文件系统中能直接访问的却是上述那个“没有使用价值的”系统时间。这种情况就为应用带来了很大的不便。
为了获得一个有实际使用价值的系统时间,我们就需要系统时间能与目标板的实时时钟保持同步。
实际上。在VxWorks for x86系列的机器中,可以通过读写特定的端口来读取/设置保存在BIOS中的实时时钟。
2 VxWorks for x86中系统时间和实时时钟的同步
使用VxWorks的ansiTime库(time.h)中的time()函数可以读取当前秒钟形式的日历时间,也就是系统加电后相对于基准时间所经过的秒数;使用locatime ()函数则可以将此日历时间转换成tm型结构的日期和时间;之后,再使用asctime()函数可将tm型结构的日期和时间转换成包含日期和时间的字符串。
使用以上这些函数可以编写一个显示当前系统时间的函数GetSysTime(),其内容如下:
![](http://m.amcfsurvey.com/editerupload/fetch/20131219/202538_1_0.jpg)
系统加电后,调用GetSysTime (函数,其显示内容为“time is:THU JAN 01 00:00:00 1970”。而在实际应用中,通常希望获取保存在BIOS中的实时时钟,并使用这个实时时钟来设置系统时间,从而使系统时间与实时时钟保持同步。因此,在VxWorks for x86系统中,可以通过读写端口0x70,0x71来访问BIOS中的实时时钟。其中,端口地址0x70对应的是实时时钟的索引寄存器(表1所列是实时时钟索引寄存器的定义),端口地址0x71对应的是实时时钟的数据寄存器。实时时钟的秒、分、时,日、月、年在索引寄存器中的存放地址分别是0x00、0x02、0x04,0x07、0x08、0x09。
需要注意的是,从端口中读到的数据,其格式为BCD码,因此在使用前还需要将其转换为十进制数。
在把转换后的实时时钟的秒、分、时,日、月、年等数据赋给tm型结构变量的相应成员后,可使用ansiTime库(time.h)中的mktime ()函数将tm型结构的日期和时间转换成秒钟形式的日历时间,并烙其赋给timespec型结构变量的tv-sec成员(timespec型结构的tv_nsec成员可设置为0),这样,通过使用clockLjb库中的clock_settime()函数就可以将系统时间设置为实时时钟的时间,从而实现系统时间与实时时钟同步。
![](http://m.amcfsurvey.com/editerupload/fetch/20131219/202538_1_1.jpg)
![](http://m.amcfsurvey.com/webstorage/images/2014/m/wx.png)
加入微信
获取电子行业最新资讯
搜索微信公众号:EEPW
或用微信扫描左侧二维码