Cross Trigger Interface(CTI)是ARM CoreSight调试架构中的关键组件,负责处理器核与调试系统之间的触发信号路由。在Cortex-A8处理器中,CTI作为硬件调试基础设施的核心部分,实现了多核系统的高效协同调试能力。
CTI的核心功能是通过可编程的触发通道网络,将处理器内部事件(如断点、观察点)与外部调试工具连接起来。其架构特点包括:
注意:CTI寄存器访问需要调试权限,普通用户模式下操作会导致未定义指令异常
寄存器地址:0x000(基址偏移)
位域结构:
code复制| 31:1 | 0 |
|------|---|
| 保留 | GLBEN |
关键功能位:
配置示例:
c复制// 启用CTI全局功能
*(volatile uint32_t *)(CTI_BASE + 0x000) = 0x1;
寄存器地址:0x010
位域结构:
code复制| 31:9 | 8 | 7:1 | 0 |
|------|---|---|---|
| SBZ | nCTIIRQ_ACK | SBZ | EDBGRQ_ACK |
操作特性:
典型应用场景:
c复制// 处理调试中断后清除触发信号
void handle_debug_irq() {
*(volatile uint32_t *)(CTI_BASE + 0x010) = 0x101; // 同时清除两种触发
}
寄存器地址:0x014
位域结构:
code复制| 31:4 | 3:0 |
|------|-----|
| 保留 | APPSET |
操作特性:
通道触发示例:
c复制// 触发通道0事件
*(volatile uint32_t *)(CTI_BASE + 0x014) = 0x1;
寄存器地址:0x034
位域结构:
code复制| 31:4 | 3 | 2 | 1 | 0 |
|------|---|---|---|---|
| 保留 | CHGATE3 | CHGATE2 | CHGATE1 | CHGATE0 |
功能说明:
使用场景:
c复制// 隔离通道0,仅本地处理
*(volatile uint32_t *)(CTI_BASE + 0x034) = 0xE;
寄存器地址:0x130
位域结构:
code复制| 31:9 | 8:0 |
|------|-----|
| RAZ | TRIGINSTATUS |
状态指示:
寄存器地址:0x138
位域结构:
code复制| 31:4 | 3:0 |
|------|-----|
| RAZ | CHOUTSTATUS |
状态监测:
c复制// 检查通道0是否有输出触发
if (*(volatile uint32_t *)(CTI_BASE + 0x138) & 0x1) {
// 通道0活跃处理
}
典型的多核CTI连接拓扑:
code复制[Core0 CTI] ---- [CTM] ---- [Core1 CTI]
| |
[ETM] [ETM]
关键实现步骤:
利用CTI连接PMU和ETM:
c复制// 配置CTIINEN0将PMU事件映射到通道0
*(volatile uint32_t *)(CTI_BASE + 0x020) = 0x1;
// 配置CTIOUTEN1将通道0事件输出到ETM
*(volatile uint32_t *)(CTI_BASE + 0x0A0) = 0x1;
// 启用边缘检测(ASICCTL寄存器)
*(volatile uint32_t *)(CTI_BASE + 0x140) |= 0x1;
使用CTIAPPPULSE寄存器生成精确的单周期脉冲:
c复制// 生成通道0的单周期脉冲
*(volatile uint32_t *)(CTI_BASE + 0x01C) = 0x1;
注意:脉冲宽度固定为1个CTICLK周期,外部电路可扩展
通过组合CTIINEN和CTIOUTEN实现条件触发:
c复制// 仅当ETM触发且通道1活跃时才产生调试中断
*(volatile uint32_t *)(CTI_BASE + 0x020) = 0x2; // ETM→通道1
*(volatile uint32_t *)(CTI_BASE + 0x0A8) = 0x2; // 通道1→DBGRQ
检查清单:
解决方案:
调试建议:
问题现象:断点触发到调试器响应存在>10周期延迟
优化措施:
效果对比:
| 配置方案 | 平均延迟(周期) |
|---|---|
| 默认路由 | 12 |
| 优化路由 | 3 |
调试步骤:
关键寄存器配置:
c复制// 核0配置
*(volatile uint32_t *)(CTI0_BASE + 0x024) = 0x1; // 观察点→通道0
*(volatile uint32_t *)(CTI0_BASE + 0x034) = 0xE; // 禁止其他通道
// 核1配置
*(volatile uint32_t *)(CTI1_BASE + 0x024) = 0x1;
*(volatile uint32_t *)(CTI1_BASE + 0x034) = 0xE;
| 寄存器名 | 地址偏移 | 类型 | 关键功能 |
|---|---|---|---|
| CTICONTROL | 0x000 | R/W | 全局使能控制 |
| CTIINTACK | 0x010 | WO | 中断请求清除 |
| CTIAPPSET | 0x014 | R/W | 软件触发设置 |
| CTIINEN0 | 0x020 | R/W | 输入触发使能 |
| CTIOUTEN0 | 0x0A0 | R/W | 输出触发使能 |
| CTICHGATE | 0x034 | R/W | 通道门控 |
c复制void cti_init(uint32_t base) {
// 1. 禁用所有功能
REG_WRITE(base + 0x000, 0x0);
// 2. 配置输入输出映射
REG_WRITE(base + 0x020, 0x1); // INEN0
REG_WRITE(base + 0x0A0, 0x1); // OUTEN0
// 3. 启用全局功能
REG_WRITE(base + 0x000, 0x1);
}