我的方法更老土,设定时器。。。。。。。。
不过我是每分钟都有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中的所有时钟信息吗?包括年月日,时分秒等。
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下以导航按键控制云台/机械臂姿态调整被打赏¥29元 | |
| 【树莓派5】便携热成像仪被打赏¥36元 | |
| 【树莓派5】环境监测仪被打赏¥35元 | |
| OK1126B-S开发板下多时段语音提示型电子时钟被打赏¥27元 | |
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |