嵌入式爱好者

335xRTC时间不能往前设置的问题分析

2021-4-23 09:50| 发布者: ljb2019001| 查看: 666| 评论: 0

类目: 知识库  >  AM335x系列产品     文档编号: 492

问题描述

linux中使用date设置时间后用hwclock -w同步到RTC,重启后,时间不能往前设置;在使用的时候发现/etc中有一个timestamp,删除就能设置时间;

原因分析

1.timestamp时间戳文件怎么生成的,他的作用是什么?

时间戳表示unix当初订立的时间,简单用 1970-1-1 , 0:00:00 到现在经过的秒数

/etc/rc6.d/S25save-rtc.sh

内容如下,其实就是生成时间戳文件

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

通过对文件系统运行级别的了解

# Runlevel 0 is halt.

# Runlevel 1 is single-user.

# Runlevels 2-5 are multi-user.

# Runlevel 6 is reboot.

rc6.d是运行级别是6,即只有reboot的时候才能运行。如上述代码

到这就解决了为什么我一直没有生成时间戳文件的原因,是通过reboot重启才能生成,而我是通过断电重启。

运行级别相关知识

init进程读取“/etc/inittab”文件中的信进入inittab中预设的运行级别,按顺序运行该运行级别对应文件夹(init*.d)下的脚本,通常情况下,“/etc/rcS.d/”目录下的启动脚本首先被执行,然后是“/etc/rcN.d/”目录。例如您设定的运行级别为3,那么它对应的启动目录为“/etc/rc3.d/”

2.思考为什么这个时间戳会导致时间不能往前面设置,看如下代码

脚本是/etc/rcS.d/S55bootmisc.sh

# Set the system clock from hardware clock

# If the timestamp is more recent than the current time,

# use the timestamp instead.

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` #获取系统时间   

read TIMESTAMP < /etc/timestamp #读取/etc/timestamp保存的时间戳

if [ ${TIMESTAMP} -gt $SYSTEMDATE ]; then #如果上次保存的时间戳大于系统时间,将时间戳设置为系统时间

date -u ${TIMESTAMP#????}${TIMESTAMP%????????}

#${}在shell中可以得到不同的值 #????删除左边四位  %????????删除右边八位

test -x /etc/init.d/hwclock.sh && /etc/init.d/hwclock.sh stop  

fi

fi

分析到这里,客户很可能如果先设置一个比较未来的时间,然后reboot重启的话,会调用/etc/rc6.d/S25save-rtc.sh去生成时间戳;之后设置比较前的时间,再断电重启,由于时间戳存在,就会比较时间,将最大的时间保存成系统时间,所以导致无法往前设置时间。

但是我这边一直复现不了,原因是下面的脚本引起的

其中hwclock.sh不管输入start参数还是stop参数

实际就是这一句hwclock --systohc实现的就是 rtc用做系统时间

而我在github找到的这个脚本的源码

对应关系则是

Start hwclock --systohc rtc用做系统时间

Stop hwclock -w   将系统时间保存在rtc


问题总结

该问题是linux在RTC时间设置上的一个bug,应该对应的关系是不管start和stop,都应该是rtc用做系统时间

/etc/rc6.d/S25save-rtc.sh  生成时间戳

/etc/rcS.d/S55bootmisc.sh 对比时间戳和RTC时间

/etc/init.d/hwclock.sh 保存时间到RTC或者把RTC时间设置到系统

 

时间和时间戳的转换

将时间变成时间戳

date -d '202504100543' +%s

输出 1744234980

 

将时间戳变成时间

date -d @1744234980

输出 Thu Apr 10 05:43:00 CST 2025

 

查看当前时间戳

date +%s

 

查看实际保存的时间戳

cat /etc/timestamp


已解决

未解决

只是看看

最新评论

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2024-5-3 19:04

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

返回顶部