我的方法更老土,设定时器。。。。。。。。
不过我是每分钟都有GPS校时的,运行的还可以
-> ctime_test
tm_sec = 43
tm_min = 11
tm_hour = 19
tm_mday = 11
tm_mon = 8
tm_year = 5
SUN FEB 06 06:28:15 2106
current data:1-6-206
current data:06-28
value = 19 = 0x13
,************************************************************
从以上结果来看,从BIOS中读取的时间是正确的。问题出在
sysOutByte( 0x70, 0x09 );/*year*/
cYear = sysInByte( 0x71 );
ahora.tm_year = ( cYear & 0x0F ) + 10 * ( ( cYear & 0xF0 ) >> 4 );
printf( "tm_year = %d\n", ahora.tm_year );
return mktime( &ahora );
,如果改成ahora.tm_year = ( cYear & 0x0F ) + 10 * ( ( cYear & 0xF0 ) >> 4 )+100;
试验运行的结果是正确的。
struct tm中tm_year为当前年减1900
BIOS中减2000;
至于为什么会出现时间固定,就不太清楚了,可能和mktime()函数的内部结构有关,有可能是数据错误,直接返回,只是猜想而以哦
星期和月份错的原因还是因为vxWorks和BIOS的时间格式不相同造成的。
tm结构中int tm_mon的范围是0-11;
而BIOS中的月份是1-12;
这样你得到的月份就差了一个月。
在asctime和mktime函数中认的月份是tm_mon%12。
如果你要用字符串显示的话,你就要在变换之前把tm_mon-1(最好用tm_mon=tm_mon%12);
或者直接用tm结构显示,或者自己写转换函数,很简单的。
至于向BIOS中写时间的问题,可根据需要,不过最好还是在手动更改时间或程序结束时向BIOS中写时间。
写法:
以秒为例子,unsgined char temp;
temp=tm_sec/10*16+tm_sec%10;
sysOutByte(0x70,0x00);
sysOutByte(0x71,temp);
由于我用zinc,我没有用到字符串显示时间,所以我用的是BIOS标准。如果用vxWorks标准的话很多tm项的取值范围都是不一样的,要注意。
我也是刚学,以后多交流。
星期和月份错的原因还是因为vxWorks和BIOS的时间格式不相同造成的。
tm结构中int tm_mon的范围是0-11;
而BIOS中的月份是1-12;
这样你得到的月份就差了一个月。
在asctime和mktime函数中认的月份是tm_mon%12。
如果你要用字符串显示的话,你就要在变换之前把tm_mon-1(最好用tm_mon=tm_mon%12);
或者直接用tm结构显示,或者自己写转换函数,很简单的。
至于向BIOS中写时间的问题,可根据需要,不过最好还是在手动更改时间或程序结束时向BIOS中写时间。
写法:
以秒为例子,unsgined char temp;
temp=tm_sec/10*16+tm_sec%10;
sysOutByte(0x70,0x00);
sysOutByte(0x71,temp);
由于我用zinc,我没有用到字符串显示时间,所以我用的是BIOS标准。如果用vxWorks标准的话很多tm项的取值范围都是不一样的,要注意。
我也是刚学,以后多交流。
EarnestWang说的很对。你能告诉大家如何修改bios中的所有时钟信息吗?包括年月日,时分秒等。
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |