4. 定时器硬件原理

在 VxWorks BSP 中,时钟定时器是系统心跳(System Tick)与任务调度的物理基础。本章深入剖析三种主流硬件定时器——通用定时器(GPT)、周期中断定时器(PIT)和高精度事件定时器(HPET)的寄存器模型与工作模式,为后续中断响应性能调优奠定硬件认知基础。

学习目标:掌握三种定时器的寄存器结构、计数模式、中断产生机制,以及它们在 VxWorks BSP 中的典型配置方法。

4.1 通用定时器(GPT)

通用定时器(General Purpose Timer, GPT)是嵌入式 SoC 中最常见的定时器外设,通常集成在处理器内部,具有多通道、多模式、可编程预分频等特点。GPT 的核心寄存器模型如下表所示:

寄存器名称 偏移地址 位宽 功能描述
TCR(Timer Control Register) 0x00 32-bit 控制使能、计数方向、预分频系数、工作模式选择
TPR(Timer Prescaler Register) 0x04 16-bit 设置预分频值,决定计数时钟频率
TCNT(Timer Counter Register) 0x08 32-bit 当前计数值,可读可写
TCMP(Timer Compare Register) 0x0C 32-bit 比较匹配值,当 TCNT == TCMP 时触发中断
TISR(Timer Interrupt Status Register) 0x10 8-bit 中断状态标志位,写 1 清除

4.1.1 GPT 工作模式

  • 自由运行模式(Free-Running Mode):计数器从 0 递增到最大值(0xFFFFFFFF)后回绕到 0 继续计数,不产生中断。
  • 周期模式(Periodic Mode):计数器从 0 递增到 TCMP 值后自动清零并重新计数,每次匹配产生一次中断。
  • 单次模式(One-Shot Mode):计数器从 0 递增到 TCMP 值后停止计数,产生一次中断后不再启动。
  • 门控模式(Gated Mode):由外部引脚电平控制计数启停,常用于脉冲宽度测量。
VxWorks 应用场景:GPT 通常用于辅助定时器(Auxiliary Timer),实现高精度延时(sysAuxClk)或外设超时监控。
GPT 周期模式工作流程 时钟源 预分频器 TCNT 计数器 比较器 中断 TCMP 比较值 TCR 控制寄存器 工作流程:时钟源 → 预分频 → TCNT 递增 → 与 TCMP 比较 → 匹配时产生中断 TCNT 自动清零后重新计数,实现固定周期中断

4.2 周期中断定时器(PIT)

周期中断定时器(Periodic Interrupt Timer, PIT)是 x86 架构中经典的定时器外设,广泛用于 PC/AT 兼容系统。PIT 的核心芯片为 Intel 8254,包含三个独立的 16 位计数器通道。其寄存器模型如下:

I/O 端口 寄存器名称 访问类型 功能描述
0x40 Counter 0 数据端口 读/写 通道 0 计数值读写,通常用于系统定时器(IRQ 0)
0x41 Counter 1 数据端口 读/写 通道 1 计数值读写,通常用于 DRAM 刷新
0x42 Counter 2 数据端口 读/写 通道 2 计数值读写,通常用于扬声器音调
0x43 控制字寄存器 只写 设置工作模式、读写格式、计数器选择

4.2.1 PIT 工作模式

PIT 支持 6 种工作模式,其中与 VxWorks BSP 最相关的是模式 2(速率发生器)和模式 3(方波发生器):

  • 模式 0(中断终止计数):写入计数值后开始计数,到达 0 时输出高电平并产生中断。
  • 模式 1(可编程单稳):由外部触发启动,输出固定宽度的低电平脉冲。
  • 模式 2(速率发生器):连续产生周期性的负脉冲,周期 = 计数值 × 时钟周期。
  • 模式 3(方波发生器):输出对称方波,高/低电平各占一半周期。
  • 模式 4(软件触发选通):写入计数值后开始计数,到达 0 时输出一个时钟周期的负脉冲。
  • 模式 5(硬件触发选通):由外部触发启动,到达 0 时输出一个时钟周期的负脉冲。
BSP 注意事项:在 x86 平台 VxWorks BSP 中,PIT 通道 0 通常配置为模式 3(方波发生器),输出连接到中断控制器 IRQ 0,作为系统时钟 sysClk 的硬件源。修改计数值时需先写入控制字,再分两次写入低字节和高字节。
PIT 8254 内部结构框图 数据总线 控制逻辑 控制字寄存器 Counter 0 IRQ 0 Counter 1 DRAM 刷新 Counter 2 扬声器 PIT 关键特性 • 3 个独立 16 位计数器 • 6 种可编程工作模式 • 二进制/BCD 计数格式 • 最大计数频率 10 MHz • 读回命令支持锁存 • 兼容 8253 软件接口

4.3 高精度事件定时器(HPET)

高精度事件定时器(High Precision Event Timer, HPET)是 Intel 提出的新一代定时器标准,旨在替代传统的 PIT 和 RTC 定时器。HPET 提供更高的计数频率(至少 10 MHz)、多个独立的比较器以及更精确的中断控制能力。

4.3.1 HPET 寄存器模型

HPET 通过内存映射 I/O(MMIO)访问,基地址由 ACPI 表提供。其寄存器空间分为通用寄存器组和定时器组:

偏移地址 寄存器名称 位宽 功能描述
0x000 GCAP_ID(General Capabilities ID) 64-bit HPET 版本、定时器数量、计数器位宽
0x010 GEN_CONF(General Configuration) 64-bit 全局使能、Legacy 替换模式
0x020 GINTR_STA(General Interrupt Status) 64-bit 全局中断状态位
0x0F0 MAIN_CNT(Main Counter Value) 64-bit 主计数器当前值,只读
0x100 + n*0x20 Tn_CONF(Timer n Configuration) 64-bit 定时器 n 的中断使能、触发方式、路由
0x108 + n*0x20 Tn_CMP(Timer n Comparator) 64-bit 定时器 n 的比较值
0x110 + n*0x20 Tn_FSB(Timer n FSB Interrupt Route) 64-bit FSB 中断路由配置(可选)

4.3.2 HPET 工作模式

  • 周期模式(Periodic Mode):定时器比较值自动累加周期值,产生周期性中断。
  • 非周期模式(Non-Periodic Mode / One-Shot):比较值匹配后停止,产生单次中断。
  • Legacy 替换模式:将定时器 0 映射到 IRQ 0,定时器 1 映射到 IRQ 8,兼容传统 PIT/RTC 中断路由。
VxWorks 配置建议:在支持 HPET 的平台上,BSP 应优先使用 HPET 作为系统时钟源。HPET 的 64 位主计数器可提供纳秒级时间戳,配合 VxWorks 的 sysTimestamp 驱动可实现高精度性能分析。
HPET 寄存器空间布局 通用寄存器组 0x000 GCAP_ID 0x010 GEN_CONF 0x020 GINTR_STA 0x0F0 MAIN_CNT 定时器 0 组 0x100 T0_CONF 0x108 T0_CMP 0x110 T0_FSB 定时器 1 组 0x120 T1_CONF 0x128 T1_CMP 0x130 T1_FSB ... ... HPET 支持最多 32 个定时器组,每个定时器组包含配置、比较值和 FSB 路由寄存器

4.4 三种定时器对比分析

在 VxWorks BSP 开发中,选择合适的定时器硬件直接影响系统时钟精度和中断响应性能。下表从关键维度对比 GPT、PIT 和 HPET:

对比维度 GPT PIT (8254) HPET
计数器位宽 16/32/64 位(取决于 SoC) 16 位 32/64 位
典型频率 1 MHz ~ 100 MHz 1.19318 MHz 10 MHz ~ 25 MHz
最小分辨率 10 ns ~ 1 μs ~838 ns 40 ns ~ 100 ns
中断模式 周期/单次/门控 6 种模式 周期/单次/Legacy
中断路由 固定或可编程 固定 IRQ 0/8 可编程 FSB/MSI
访问方式 MMIO I/O 端口 MMIO
VxWorks 典型用途 辅助时钟、高精度延时 系统时钟(sysClk) 系统时钟、时间戳

4.5 VxWorks BSP 定时器初始化示例

以下代码展示在 VxWorks BSP 中初始化 GPT 定时器的典型流程,配置为周期模式,产生 1 ms 中断:

/* GPT 寄存器基地址 */
#define GPT_BASE_ADDR    0x40000000
#define GPT_TCR_OFFSET   0x00
#define GPT_TPR_OFFSET   0x04
#define GPT_TCNT_OFFSET  0x08
#define GPT_TCMP_OFFSET  0x0C
#define GPT_TISR_OFFSET  0x10

/* TCR 控制位定义 */
#define GPT_TCR_EN        (1 << 0)   /* 定时器使能 */
#define GPT_TCR_MODE_PER  (1 << 1)   /* 周期模式 */
#define GPT_TCR_PRE_1     (0 << 4)   /* 预分频 1:1 */

/* 初始化 GPT 为 1ms 周期中断 */
STATUS gptInit (UINT32 sysClkRate)
{
    UINT32  preScale;
    UINT32  cmpValue;
    UINT32  timerFreq;

    /* 1. 计算预分频和比较值 */
    timerFreq = SYS_CLOCK_FREQ;          /* 假设 50 MHz */
    preScale  = 1;                       /* 预分频 1:1 */
    cmpValue  = timerFreq / sysClkRate;  /* 50 MHz / 1000 = 50000 */

    /* 2. 关闭定时器 */
    *(volatile UINT32 *)(GPT_BASE_ADDR + GPT_TCR_OFFSET) = 0;

    /* 3. 设置预分频 */
    *(volatile UINT32 *)(GPT_BASE_ADDR + GPT_TPR_OFFSET) = preScale - 1;

    /* 4. 设置比较值 */
    *(volatile UINT32 *)(GPT_BASE_ADDR + GPT_TCMP_OFFSET) = cmpValue;

    /* 5. 清零计数器 */
    *(volatile UINT32 *)(GPT_BASE_ADDR + GPT_TCNT_OFFSET) = 0;

    /* 6. 清除中断标志 */
    *(volatile UINT32 *)(GPT_BASE_ADDR + GPT_TISR_OFFSET) = 0xFF;

    /* 7. 配置控制寄存器:使能 + 周期模式 + 预分频 */
    *(volatile UINT32 *)(GPT_BASE_ADDR + GPT_TCR_OFFSET) = 
        GPT_TCR_EN | GPT_TCR_MODE_PER | GPT_TCR_PRE_1;

    /* 8. 连接中断服务例程 */
    sysIntConnect (INUM_TO_IVEC(GPT_INT_VEC), gptIsr);

    return OK;
}
性能调优要点:GPT 的预分频系数和比较值直接影响中断频率和 CPU 负载。在 VxWorks 中,系统时钟频率(sysClkRate)通常设为 100 Hz ~ 1000 Hz。频率越高,调度精度越高,但中断开销也越大。建议在 BSP 中提供可配置的宏定义,方便调优。

4.6 中断响应时间关键因素

定时器中断的响应时间直接影响 VxWorks 的实时性能。以下是影响中断延迟的硬件相关因素:

  • 中断控制器延迟:从定时器输出到 CPU 中断引脚的电平/边沿传播时间。
  • CPU 中断响应时间:CPU 保存上下文、跳转到中断向量表的时间。
  • 中断嵌套与优先级:高优先级中断可能抢占定时器中断服务。
  • 缓存与内存访问:中断服务代码和数据的缓存命中率。
  • 定时器硬件延迟:从计数器匹配到中断标志置位的硬件延迟。
BSP 调优建议:在 VxWorks BSP 中,应确保定时器中断的优先级设置为最高(或次高),避免被其他外设中断频繁抢占。同时,将定时器中断服务代码锁定在指令缓存中(使用 CACHE_LOCK_CODE),可显著降低中断延迟抖动。
定时器中断响应延迟分解 定时器匹配 中断信号 <