Bernard Xiong 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
..
figures 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
README.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
README_zh.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_boottime.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_boottime_zh.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_hrtimer.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_hrtimer_zh.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_time_core.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_time_core_zh.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_timer.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días
clock_timer_zh.md 743b614875 [components][clock_time] Refactor time subsystem around clock_time (#11111) hai 3 días

README.md

@page page_device_clock_time Clock Time Subsystem

Overview

The clock_time subsystem provides a unified, high-resolution time base and programmable event scheduling for RT-Thread. It decouples a monotonic counter (clock source) from deadline delivery (clock event), so platforms can mix hardware counters and timers while the kernel and libc see consistent behavior.

Architecture

Clock time architecture

Layering and Responsibilities

  • Upper layers:
    • POSIX/libc time APIs (clock_gettime, nanosleep) use boottime and hrtimer APIs.
    • Soft RTC uses boottime as its monotonic time base for timekeeping.
    • Device drivers (input event timestamps, vDSO, PIC statistics) use boottime for timestamping.
  • clock_time subsystem: core APIs, clock source/event devices, the hrtimer scheduler, boottime helpers, and the clock_timer adapter.
  • Lower layers: BSP drivers provide hardware counters and timers, which are wrapped as clock_time devices or clock_timer devices.

Internal Components

  • Core API (clock_time_core.c)
    • Registers clock_time devices, manages default source/event selection, and provides counter <-> nanosecond conversion with fixed-point scaling.
  • Clock source device (rt_clock_time_device + RT_CLOCK_TIME_CAP_SOURCE)
    • Supplies a free-running counter and frequency for monotonic time reads.
  • Clock event device (rt_clock_time_device + RT_CLOCK_TIME_CAP_EVENT)
    • Programs the next deadline and calls rt_clock_time_event_isr() on expiry.
  • Clock hrtimer (clock_hrtimer.c)
    • Schedules high-resolution timeouts, programs the next event, and dispatches callbacks. Falls back to software timer when no hardware event is available.
  • Boottime helpers (clock_boottime.c)
    • Converts the monotonic counter into timeval/timespec/seconds for upper layers.
  • Clock timer adapter (clock_timer.c)
    • Exposes a unified hardware timer device (rt_clock_timer) and can register itself as a clock_time event device.
  • Architecture sources (arch/* and clock_time_arm_arch.c)
    • Provide fast CPU counters or architectural timers and register them as the default clock source when available.

Data Flow

  • Read path
    • Clock source counter -> scaled resolution -> nanoseconds -> boottime or clock_gettime.
  • Timeout path
    • HRTimer queue -> next expiry -> set_timeout on event device -> event ISR -> hrtimer processing -> callbacks.

Configuration

Enable the subsystem in menuconfig:

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

Optional settings:

  • CLOCK_TIMER_FREQ (RISC-V): base counter frequency used by the clock source.
  • RT_CLOCK_TIME_ARM_ARCH: enable ARM architected timer integration (DM/OFW).

BSP Integration Checklist

  • Provide a clock source:
    • Register a rt_clock_time_device with CAP_SOURCE, or use the provided architecture source (AArch64/RISC-V) via rt_clock_time_source_init().
  • Provide a clock event:
    • Register a rt_clock_time_device with CAP_EVENT and call rt_clock_time_event_isr() in its interrupt handler.
    • Or register a rt_clock_timer device; it can become the default event device automatically.
  • Keep event ISRs short; heavy work should run in thread context if needed.

Detailed Documents