【linux】ARM开发板上设置RTC时间,断电重启后,设置失效的原因分析

问题描述

linux中使用date设置时间后用hwclock -w同步到RTC,断电重启后,有时会失效

原因分析

保存时间戳

1、使用命令关机(halt)会调用rc0.d中的脚本;
2、使用命令重启(reboot)会调用rc6.d中的脚本;
3、其中都有脚本S25save-rtc.sh,S25save-rtc.sh是对 ../init.d/save-rtc.sh的软连接;
4、save-rtc.sh脚本内容:

date -u +%4Y%2m%2d%2H%2M%2S > /etc/timestamp

使用时间戳

1、启动内核后启动第一个程序init,init调用脚本/etc/inittab

2、inittab中启动的第一个脚本是:/etc/init.d/rcS

  7 # Boot-time system configuration/initialization script.
  8 # This is run first except when booting in emergency (-b) mode.
  9 si::sysinit:/etc/init.d/rcS

3、init.d/rcS中有exec /etc/init.d/rc S;
4、rc中循环调用rcS.d中的脚本;
5、rcS.d中有脚本S55bootmisc.sh,软连接到 ../init.d/bootmisc.sh
6、 bootmisc.sh脚本关于timestamp的内容如下:

test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh start
if test -e /etc/timestamp   #如果/etc/timestamp文件存在
then
SYSTEMDATE=`date -u +%4Y%2m%2d%2H%2M%2S`    #获取系统时间
read TIMESTAMP < /etc/timestamp             #读取/etc/timestamp保存的时间戳
if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then    #如果上次保存的时间戳大于系统时间,将时间戳设置为系统时间
    # format the timestamp as date expects it (2m2d2H2M4Y.2S)
    TS_YR=${TIMESTAMP%??????????}
    TS_SEC=${TIMESTAMP#????????????}
    TS_FIRST12=${TIMESTAMP%??}
    TS_MIDDLE8=${TS_FIRST12#????}
    date -u ${TS_MIDDLE8}${TS_YR}.${TS_SEC}
    test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh stop
fi

总结

ARM开发板上设置RTC时间,如果执行reboot或者halt将会保存时间戳,重启后时间正常;
如果是断电重启,/etc/timestamp中保存的时间戳是上次执行reboot或halt保存的,如果执行reboot或halt保存的时间戳比你想设置的RTC时间大,就会在执行启动脚本时,将/etc/timestamp中保存的时间戳设置到RTC中,导致出错。
比如,有人故意设置一个很未来的时间,而且ARM板在使用过程中,都是直接断电,将会导致RTC设置一直是失败的。
—end

你可能感兴趣的:(linux)