ARM架构中的时钟与定时器分布

一、时钟系统的分布方式

ARM的时钟系统通常采用分层设计,具体分布方式取决于SoC实现:

1. 按簇共享模式(最常见)

┌─────────────────────────────────────┐
│           SoC 芯片                   │
│  ┌──────────────┐  ┌──────────────┐ │
│  │   簇0 (A53)   │  │   簇1 (A72)  │ │
│  │  ┌───┬───┐   │  │  ┌───┬───┐   │ │
│  │  │C0 │C1 │   │  │  │C2 │C3 │   │ │
│  │  └───┴───┘   │  │  └───┴───┘   │ │
│  │   共享时钟0   │  │   共享时钟1   │ │
│  └──────────────┘  └──────────────┘ │
└─────────────────────────────────────┘
  • 同一簇内的核心共享时钟源
  • 不同簇可以独立调频(支持big.LITTLE架构)
  • 典型例子:树莓派4的Cortex-A72簇和A53簇

2. 全局共享模式

  • 所有核心共享同一个时钟源
  • 常见于简单的嵌入式系统
  • 优点:设计简单,同步容易
  • 缺点:无法独立调频节能

3. 每核独立模式(较少见)

  • 每个核心有独立时钟源
  • 用于需要精细功耗控制的场景
  • 实现复杂度高,成本较大

二、定时器系统的分类与分布

ARM架构定义了多种定时器,采用"共享源头 + 私有接口"的混合设计:

1. 系统计数器 - 全局共享

        ┌────────────────────┐
        │  系统计数器(全局)   │ ← 唯一的64位计数源
        │  提供全局时间基准   │
        └─────────┬──────────┘
                  │ 广播到所有核心
     ┌────────────┼────────────┐
     ▼            ▼            ▼
┌─────────┐  ┌─────────┐  ┌─────────┐
│ 核0接口 │  │ 核1接口 │  │ 核2接口 │
└─────────┘  └─────────┘  └─────────┘
  • 全局唯一,所有核心共享同一个计数器
  • 64位单调递增计数器
  • 所有核心看到相同的时间值
  • 用于实现全局时间同步

2. 私有定时器 - 每核一个

定时器类型 数量 用途 特点
Generic Timer (私有) 每核4个 本地调度、中断 EL0/EL1/EL2/EL3各一个
Physical Timer 每核1个 安全世界定时 TrustZone使用
Virtual Timer 每核1个 虚拟化场景 用于虚拟机调度

3. 共享外设定时器 - 芯片级

┌─────────────────────────────────────┐
│            SoC 级别                  │
│  ┌──────────────────────────────┐  │
│  │   SP804 双定时器 (共享)       │  │
│  │   - Timer 0: 系统心跳         │  │
│  │   - Timer 1: 看门狗           │  │
│  └──────────────────────────────┘  │
│  ┌──────────────────────────────┐  │
│  │   GTW (全局看门狗定时器)      │  │
│  └──────────────────────────────┘  │
└─────────────────────────────────────┘
  • SP804:经典的双定时器IP,所有核心可访问
  • MMIO定时器:通过内存映射访问,多核共享
  • 看门狗定时器:通常是共享的,监控整个系统

三、ARM Generic Timer 架构详解

这是ARM官方定义的标准定时器架构:

┌────────────────────────────────────────────────┐
│                  系统计数器                      │
│         (全局唯一,硬件实现)                     │
│         寄存器:CNTFRQ, CNTVCT                   │
└────────────────────┬───────────────────────────┘
                     │
        ┌────────────┴────────────┐
        │    计数器值广播到每个核   │
        └────────────┬────────────┘
                     │
┌────────────────────┼────────────────────────────┐
│                    ▼                             │
│  ┌─────────────────────────────────────────┐   │
│  │         核0 的定时器接口                  │   │
│  │  ┌─────────┐ ┌─────────┐ ┌─────────┐    │   │
│  │  │ EL1物理 │ │ EL1虚拟 │ │ EL2物理 │    │   │
│  │  │ 定时器  │ │ 定时器  │ │ 定时器  │    │   │
│  │  └─────────┘ └─────────┘ └─────────┘    │   │
│  └─────────────────────────────────────────┘   │
│                     ...                         │
│  ┌─────────────────────────────────────────┐   │
│  │         核N 的定时器接口                  │   │
│  └─────────────────────────────────────────┘   │
└────────────────────────────────────────────────┘

关键特点:

  1. 源头共享:系统计数器全局唯一
  2. 接口私有:每个核心有独立的比较器和中断
  3. 多异常级别:支持EL0/EL1/EL2/EL3各级别

四、实际SoC中的分布示例

树莓派4 (BCM2711) 的定时器分布:

┌─────────────────────────────────────┐
│          BCM2711 SoC                 │
│                                      │
│  [系统计数器] ← ARM Generic Timer    │
│       │                              │
│  ┌────┴────┐                         │
│  │ A72簇   │  ← 4个私有定时器接口     │
│  │ C0-C3   │                         │
│  └─────────┘                         │
│                                      │
│  [ARM定时器] ← 4个系统定时器(共享)    │
│  [SP804定时器] ← 传统双定时器(共享)   │
│  [局部定时器] ← 每核一个              │
└─────────────────────────────────────┘

五、总结对比

类型 时钟分布 定时器分布 典型用途
时钟 簇级共享(主流)
全局共享
每核独立
- CPU运行频率控制
系统计数器 - 全局唯一 提供时间基准
Generic Timer - 每核私有接口 核内调度、中断
外设定时器 - 芯片级共享 系统服务、看门狗

核心设计理念

  • 时钟:按功耗域划分(簇级共享最常见)
  • 定时器“共享源头 + 私有接口” 的混合架构
    • 保证全局时间同步(共享计数器)
    • 避免跨核竞争(私有比较器)
Logo

欢迎加入DeepSeek 技术社区。在这里,你可以找到志同道合的朋友,共同探索AI技术的奥秘。

更多推荐