关于android系统中的系统时间和rtc时间

关于android系统中的系统时间和rtc时间

说明:这是注册账号以来的第二次登录,平时也不写什么博客,今天登录一次完全是为了评论一个老铁的博客,明明是标题 systohc 的,结果内容是写的 hctosys ,难受。既然都登录了,也想不起来有什么可写的,之前的工作都在有道笔记了,刚好把最近手头上的工作记录一下,为后来有需要的老铁们提供一个思路什么的,毕竟现在我也没有搞的太明白。
最近在搞android的时间,客户反馈说设置时间或者是联网更新时间之后,重启时间就回到1970了。搞来搞去没有复现过一次,很迷,把最近看到资料整理一下。

关于android的时间

网上资料了解到,android Linux都有两个时间,一个是系统时间,一个是硬件时间(RTC时间)。RTC是实时时钟的英文 缩写,基本上在硬件上都有纽扣电池,不会断电,会一直计时;但系统时钟不一样,系统运行的时候能一直计时,但系统关机或者断电的时候就gg了。所以每次系统开机的时候,会去读取rtc中的硬件时间,写入到系统时间,然后系统时间就自己搞起来了,不再关rtc时间什么事情了。等系统关机或者什么时候,会把时间写入到rtc,这样才能保证下次开机你这个系统的时间不会错乱。

基本就是这个大概了,可能有偏差,知道的大佬评论区走一波,我自己搞的,不是专业的,不正确的指教一下。附上一些资料,上面我说的都有介绍到。
介绍了rtc驱动,以及开机读取rtc时间的机制和代码

rtc驱动以及文件结构

android写时间到rtc

疑问

我这边用的是pcf8563的rtc,驱动和网上介绍的都一样,唯独多了一个 systohc.c文件。这很明显啊,和hctosys.c文件是相反的,把系统时钟写到rtc里面保存。但是我查看内核的配置里面,并没有把这两个文件编译进内核,现在rtc有供电,系统关机可以正常保存时间,也能读时间,时间还非常准。我不明白,如果没有编译进内核,那是怎么调用的?明明没有调用,愣是打印出了log信息,整蒙了。
这是没有编译的文件,开机可以打印log,读取正确的rtc时间
另外网上没有找到 systohc.c的资料,目前为止没有。有经验的大佬赐教!感激!

更新

昨晚说到内核里面没有配置 systohc.c hctosys.c 的编译选项,但内核确实执行了读rtc的操作,关机的时候确实也写入了系统时间,这什么情况呢?说一下我的理解。

关于读rtc时间的函数,hctosys.c 虽然没有编译进内核,但是文件里面,在最后使用 late_initcall 函数将 rtc_hctosys 函数注册到了内核的init字段,等到内核启动的后期就会执行这一段的函数,所以就执行了读rtc时间,设置到系统时间这个操作。

开机打印的log,打印信息在hctosys文件和pcf8563驱动的读函数中。
内核打印信息

开机打印效果
从log可以看出来,在内核启动后期,执行了 rtc_hctosys 函数,调用8563驱动的读函数,获取rtc时间,设置到 系统时间。

另外关于systohc 文件,这个文件同样没有编译进内核,而且没有使用initcall函数,这个函数是真没调用,打印信息都没出来。但是总要把时间设置进rtc,我试过使用reboot开机,发现关机的时候系统没有将时间写入rtc,那这个操作很可能就在设置时间的时候直接调用了底层驱动的写函数,设置系统时间的时候顺带把时间也设置进了rtc,这样就保证了系统时间和rtc时间同步,等到系统关机的时候,再开机读取的rtc时间就是正确的时间。

验证:打印log
8563驱动中的写函数
打印信息
从打印信息可以看到,手动在android界面设置时间之后,就调用了底层的写函数将时间写入rtc了。机智的我

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android 11 系统启动时获取 RTC 时间并同步到系统时间的过程主要涉及以下几个文件: 1. 内核启动过程:在内核启动过程,会调用硬件 RTC 驱动程序的接口来获取 RTC 时间。具体的实现可以在硬件相关的驱动文件找到,通常会在 `drivers/rtc` 目录下。 2. init 进程启动过程:在 init 进程启动过程系统会执行 `/init.rc` 脚本,其包括一个名为 `import` 的命令,用于导入 `*.rc` 格式的配置文件。在 Android 11 ,`/init.rc` 会导入一个名为 `/system/etc/init/hw/init.target.rc` 的配置文件,该文件会启动 `hwservicemanager` 和 `time_daemon` 服务。`time_daemon` 服务会监听系统时间变化的消息,并在系统时间发生变化时调用 `datetime` 应用程序来同步时间。同时,`time_daemon` 服务还会启动 `hwtime` 服务,该服务会通过 `hwservicemanager` 获取硬件 RTC 时间,并将其同步到系统时间。 3. `datetime` 应用程序:在 Android 11 ,`datetime` 应用程序的主要作用是接收 `time_daemon` 服务发来的时间变化消息,并将系统时间同步到硬件 RTC 时间。具体的实现可以在 `frameworks/base/cmds/datetime` 目录下找到。 综上所述,在 Android 11 获取 RTC 时间并同步到系统时间的过程较为复杂,涉及到多个组件和文件的协同工作。如果你需要深入了解这个过程,可以参考上述文件的代码实现和相关文档。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值