4. 定时器硬件原理:GPT、PIT、HPET 寄存器模型与工作模式
在 VxWorks BSP 中,时钟定时器是系统心跳(System Tick)与任务调度的物理基础。本章深入剖析三种主流硬件定时器——通用定时器(GPT)、周期中断定时器(PIT)和高精度事件定时器(HPET)的寄存器模型与工作模式,为后续中断响应性能调优奠定硬件认知基础。
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):由外部引脚电平控制计数启停,常用于脉冲宽度测量。
sysAuxClk)或外设超时监控。
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 时输出一个时钟周期的负脉冲。
sysClk 的硬件源。修改计数值时需先写入控制字,再分两次写入低字节和高字节。
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 中断路由。
sysTimestamp 驱动可实现高精度性能分析。
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;
}
sysClkRate)通常设为 100 Hz ~ 1000 Hz。频率越高,调度精度越高,但中断开销也越大。建议在 BSP 中提供可配置的宏定义,方便调优。
4.6 中断响应时间关键因素
定时器中断的响应时间直接影响 VxWorks 的实时性能。以下是影响中断延迟的硬件相关因素:
- 中断控制器延迟:从定时器输出到 CPU 中断引脚的电平/边沿传播时间。
- CPU 中断响应时间:CPU 保存上下文、跳转到中断向量表的时间。
- 中断嵌套与优先级:高优先级中断可能抢占定时器中断服务。
- 缓存与内存访问:中断服务代码和数据的缓存命中率。
- 定时器硬件延迟:从计数器匹配到中断标志置位的硬件延迟。
CACHE_LOCK_CODE),可显著降低中断延迟抖动。