summaryrefslogtreecommitdiff
path: root/documentation/6.components/device-driver/clock_time/README_zh.md
blob: d4433f18c22a23ad21994d1663df5614e5fa57c0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# Clock Time 子系统概述

clock_time 子系统为 RT-Thread 提供统一的高精度时间基准与事件调度能力。
它将单调计数(时钟源)与超时事件(时钟事件)解耦,使平台可以组合不同的
硬件计数器与定时器,同时为内核与 libc 提供一致的时间行为。

# 软件架构

![Clock time architecture](figures/clock_time_arch.svg)

## 分层关系与职责

- 上层:
  - POSIX/libc 时间接口(clock_gettime、nanosleep)使用 boottime 和 hrtimer API。
  - 软 RTC 使用 boottime 作为单调时间基准进行计时。
  - 设备驱动(输入事件时间戳、vDSO、中断控制器统计)使用 boottime 获取时间戳。
- clock_time 子系统:核心 API、时钟源/事件设备、高精度定时器调度器、
  boottime 辅助函数、clock_timer 适配层。
- 下层:BSP 驱动提供硬件计数器与定时器,并封装为 clock_time 设备或
  clock_timer 设备。

## 内部组成

- Core API(clock_time_core.c)
  - 负责设备注册、默认源/事件选择,以及计数 <-> 纳秒的缩放换算。
- 时钟源设备(rt_clock_time_device + RT_CLOCK_TIME_CAP_SOURCE)
  - 提供自由运行计数器与频率,作为单调时间基准。
- 时钟事件设备(rt_clock_time_device + RT_CLOCK_TIME_CAP_EVENT)
  - 负责下一次超时编程,并在到期时调用 rt_clock_time_event_isr()。
- 高精度定时器(clock_hrtimer.c)
  - 维护超时队列、设置下一次事件并分发回调。没有硬件事件时退化为软件定时器。
- Boottime 辅助(clock_boottime.c)
  - 将单调计数转换为 timeval/timespec/秒,供上层使用。
- Clock timer 适配层(clock_timer.c)
  - 提供统一的硬件定时器设备(rt_clock_timer),并可注册为事件设备。
- 架构源(arch/* 与 clock_time_arm_arch.c)
  - 提供 CPU 计数器或架构定时器,并在可用时设置为默认时钟源。

## 数据流

- 读取路径
  - 时钟源计数 -> 缩放分辨率 -> 纳秒 -> boottime 或 clock_gettime。
- 超时路径
  - hrtimer 队列 -> 下一到期 -> 事件设备 set_timeout -> 事件中断 ->
    hrtimer 处理 -> 回调分发。

# 配置选项

在 menuconfig 中启用:

```
RT-Thread Components ->
    Device Drivers ->
        [*] Clock time subsystem (RT_USING_CLOCK_TIME)
```

可选配置:

- CLOCK_TIMER_FREQ(RISC-V):时钟源使用的基础计数频率。
- RT_CLOCK_TIME_ARM_ARCH:启用 ARM 架构定时器集成(DM/OFW)。

# BSP 集成要点

- 提供时钟源:
  - 注册带 CAP_SOURCE 的 rt_clock_time_device,或使用
    rt_clock_time_source_init() 提供的架构源。
- 提供时钟事件:
  - 注册带 CAP_EVENT 的 rt_clock_time_device,并在中断中调用
    rt_clock_time_event_isr()。
  - 或直接注册 rt_clock_timer 设备,自动成为默认事件设备。
- 事件中断应保持简短,复杂处理建议转到线程上下文。

# 详细文档

- clock_time_core.md
- clock_hrtimer.md
- clock_boottime.md
- clock_timer.md