Linux内核 -- RTC之`struct rtc_time` 字段解析

Linux Kernel 中 struct rtc_timetm_year 字段详解

1. struct rtc_time 的定义

在 Linux 内核中,struct rtc_time 用于表示实时时钟(RTC)时间。其定义如下:

c 复制代码
struct rtc_time {
    int tm_sec;   /* 分钟的秒数 (0-59) */
    int tm_min;   /* 小时的分钟数 (0-59) */
    int tm_hour;  /* 自午夜起的小时数 (0-23) */
    int tm_mday;  /* 月中的某一天 (1-31) */
    int tm_mon;   /* 自一月起的月数 (0-11) */
    int tm_year;  /* 自1900年以来的年份偏移值 */
    int tm_wday;  /* 自星期日起的天数 (0-6) */
    int tm_yday;  /* 自一月一日起的天数 (0-365) */
    int tm_isdst; /* 夏令时标志 */
};

2. tm_year 的含义

  • tm_year 表示年份的偏移值,其基准年份是 1900
  • 换句话说,
    • 如果 tm_year = 123,表示年份为 1900 + 123 = 2023
    • 如果 tm_year = 0,表示年份为 1900 + 0 = 1900

3. 使用中的注意事项

  • 获取时间时 :需要将 tm_year 加上 1900,转换为标准年份。
  • 设置时间时 :需要将标准年份减去 1900,然后赋值给 tm_year

4. 与用户空间的交互

  • 用户空间的标准库(如 glibc)中定义了类似的结构体 struct tm,其 tm_year 字段的含义与内核的 rtc_time 一致。
  • 因此,内核中的 struct rtc_time 和用户空间的 struct tm 可以直接转换。

5. 实际应用示例

获取时间

c 复制代码
struct rtc_time tm;
rtc_read_time(rtc, &tm);
int year = tm.tm_year + 1900; // 转换为标准年份
printk("Current year: %d\n", year);

设置时间

c 复制代码
struct rtc_time tm = {
    .tm_year = 2023 - 1900,  // 转换标准年份为 tm_year 的值
    .tm_mon = 11 - 1,        // 月份,从 0 开始
    .tm_mday = 30,
    .tm_hour = 12,
    .tm_min = 0,
    .tm_sec = 0,
};
rtc_set_time(rtc, &tm);

6. 与 RTC 硬件交互

  • 实时时钟硬件芯片(如 DS3231)可能以不同格式存储年份。例如,有些芯片仅存储两位数年份(如 00 表示 2000 年)。驱动程序需要将 RTC 硬件的年份格式转换为 tm_year 的格式。
  • 如果硬件仅支持 20 世纪和 21 世纪的年份,驱动程序通常会根据上下文决定世纪部分。

7. 常见问题

溢出问题

  • 由于 tm_year 是相对于 1900 的偏移值,其理论最大值取决于字段的类型(通常为 int)。
  • 在 32 位系统中,最大年份范围可达 INT_MAX - 1900

世纪问题

  • 某些硬件仅存储两位年份,转换时需要根据当前时间或用户设置推断世纪部分。

8. 小结

  • tm_year 是从 1900 开始的偏移值。
  • 获取和设置时间时需进行适当的加减操作以转换为标准年份。
  • 与 RTC 硬件交互时,可能需要额外处理世纪信息。
相关推荐
三十..4 小时前
Ceph 三大存储接口深度实践与数据保护指南
运维·ceph
9分钟带帽4 小时前
linux_系统开机自动执行shell脚本
linux·服务器
蝶豆花5 小时前
基于商城系统的功能,自动化,性能-测试报告
运维·自动化
袋鼠云数栈5 小时前
从前端到基础设施,ACOS 如何打通企业全链路可观测
运维·前端·人工智能·数据治理·数据智能
黎阳之光5 小时前
视频孪生智护供水生命线:黎阳之光赋能医疗与园区水务高质量升级
运维·物联网·算法·安全·数字孪生
志栋智能6 小时前
AI驱动无代码:降低巡检超自动化的门槛
大数据·运维·网络·人工智能·自动化
嵌入式小能手6 小时前
飞凌嵌入式ElfBoard-进程间的通信之命名管道
linux·服务器·算法
AOwhisky6 小时前
Ceph系列第六期:Ceph 文件系统(CephFS)精讲
linux·运维·网络·笔记·ceph
Land03297 小时前
RPA网页自动化:元素定位失效的7种根因与XPath鲁棒性改造方案
运维·selenium·自动化·rpa
Starry-sky(jing)7 小时前
# Linux 下 Qt 应用无障碍自动化:记一次wx无人值守系统的架构演进
linux·qt·自动化