TMS320C55x
从系统到芯片内部的完整复习地图
按“应用算法 → DSP 定位 → C55x 芯片结构 → 总线并行 → IPAD CPU → 统一物理空间 → 寻址方式 → C/汇编/链接 → 片内外设 → 实验代码”的层次展开,覆盖 TMS320C55x/VC5509 课程资料中的全部考点。
C55x / VC55091. 系统层:为什么需要 DSP
DSP 不是替代 CPU,而是用专用硬件和指令高效完成连续信号流的实时数学运算。
2. 芯片层:C55x 的结构变化
C55x 相对 C54x 的核心变化可归纳为:性能更高、功耗更低、存储结构更先进。重点抓住两个质变:可变长指令与统一的程序/数据物理空间。
C54x → C55x 的两项质变
- 可变长指令:C55x 支持 8、16、24、32、40、48 位指令;代码密度更高,但取指后需要指令缓冲与预译码重新组合。
- 统一程序/数据空间:物理地址空间统一为 24 位;访问时仍通过程序总线、数据总线和不同寻址规则完成。
- 注意:统一编址不等于随意混放,段放置由 .cmd 文件中的 MEMORY 与 SECTIONS 控制。
统一编址与哈佛结构不矛盾
统一的是物理地址空间;CPU 访问程序和数据时仍有独立的程序总线、数据总线和地址产生电路,因此仍体现改进型哈佛结构的并行取指、取数、写回能力。
3. 总线层与 IPAD CPU
总线数量和位宽是第二章最容易出填空、判断、简答和综合题的内容。C55x 的高吞吐来自单周期取程序、读多个操作数和写回结果。
总线并行流动演示
必背总线关系
- PB = 32 位,程序数据总线。
- PAB = 24 位,程序地址总线。
- BB/CB/DB/EB/FB = 16 位,5 条数据总线。
- BAB/CAB/DAB/EAB/FAB = 23 位,5 条数据地址总线。
- 总线合计:1 程序数据 + 1 程序地址 + 5 数据 + 5 数据地址 = 12 条。
CPU 的 IPAD 四个单元
| 单元 | 英文名称 | 硬件组成/关键部件 | 功能 |
|---|---|---|---|
| I | Instruction Buffer Unit 指令缓冲单元 | PB 输入、IBQ 指令缓冲队列、预译码 | 接收程序代码,缓冲可变长指令,预译码并分发。 |
| P | Program Flow Unit 程序流程单元 | PAGEN、程序地址相关寄存器 | 产生程序空间 24 位地址,控制顺序执行、跳转、调用、循环。 |
| A | Address Data Flow Unit 地址流程单元 | DAGEN、16 位 ALU、寄存器组 | 产生数据空间 23 位地址,配合 BB/CB/DB/EB/FB 访问数据。 |
| D | Data Computation Unit 数据计算单元 | 40 位 ALU、桶形移位器、乘法器/MAC、累加器 | 完成算术、逻辑、移位、乘法累加等运算。 |
C55x 主要硬件特征
两个 MAC
提高乘加密集算法吞吐,适合 FIR、相关、卷积等。
40 位 ALU/累加器
16 位输入反复乘加会产生更宽中间结果,40 位可降低溢出和舍入误差。
桶形移位器
快速完成定点缩放、规格化和移位。
辅助 ALU
用于地址修改、循环计数和指针更新。
IBQ
配合可变长指令,减少取指等待。
IDLE
无任务时进入低功耗机制。
4. 存储空间与地址规则
C55x 有统一程序/数据物理空间和独立 I/O 空间。程序空间按字节寻址,数据空间按 16 位字寻址,I/O 空间也按 16 位字寻址。
三类空间总览
| 空间 | 地址位数 | 寻址单位 | 关键规则 |
|---|---|---|---|
| 程序空间 | 24 位 | 字节,8 位为一个地址 | PAB 传 24 位地址;PB 一次读 32 位指令包。 |
| 数据空间 | 23 位逻辑地址 | 字,16 位为一个地址 | 访问时逻辑地址左移 1 位,最低位补 0,形成 24 位物理字节地址。 |
| I/O 空间 | 16 位 | 字,16 位为一个地址 | 与程序/数据空间分开,常用 port(k16) 或 ioport 访问。 |
地址转换模拟器:23 位数据字地址 → 24 位物理字节地址
规则:物理地址 = 数据字地址 ≪ 1,最低位固定补 0。
000204
32 位长字存放模拟器:LSW = MSW ⊕ 1
长字地址就是 MSW 地址,LSW 地址由 MSW 地址最低位取反得到。
0101
MSW 在偶地址,LSW 在后一个奇地址,同属一个 32 位对齐单元。
MMR 与存储器映射
MMR 是 Memory Mapped Registers,即存储器映射寄存器。许多控制寄存器借用存储空间低地址区域访问。
- 课程必记:前 96 个字地址用于 MMR。
- 写 .cmd 时常以字节为单位:96 个 16 位字 = 0xC0 字节。
程序空间对齐与取指
程序空间按字节寻址,指令长度可为 1–6 字节。PB 宽 32 位,CPU 按 4 字节边界读取指令包,常见边界地址:
000000h, 000004h, 000008h, 00000Ch, ...
指令本身可从任意字节地址开始;若 PC 不在边界,硬件从所在 32 位边界取回指令包,再从缓冲中选择真正执行的指令字节。
片上 RAM、片外存储器与容量单位
- DSP 资料常用“多少 K 字”描述容量,因为基本数据处理单位常是 16 位字。
- 128K × 16 bit = 128K 个 16 位字 = 256KB 字节。
- DARAM 是双访问 RAM,一个机器周期可支持两次访问。
- SARAM 通常单周期一次访问。
- 片外存储器通过 EMIF 扩展 SRAM、ROM、Flash、SDRAM 等。
记忆图:从逻辑空间到物理空间
24 位,字节地址,直接对应统一物理空间。
23 位,16 位字地址,访问时左移 1 位补成 24 位物理字节地址。
16 位,独立 I/O 空间,使用 port(k16) 或 ioport。
5. 指令系统与寻址方式
第三章最重要的是寻址方式:绝对寻址、直接寻址、间接寻址。复杂指令不要求全背,但要能读懂 MOV、ADD、SUB、MPY、MAC、FIR、LMS 等功能。
绝对寻址:k16、k23、port(k16)
| 形式 | 含义 | 易错点 |
|---|---|---|
| k16 | 指令中给出 16 位地址常数。访问数据空间时,通常与 DPH 高 7 位级联形成 23 位数据地址,因此受当前数据页影响。 | k16 是地址字段宽度,不是数据位宽。 |
| k23 | 指令中给出 23 位无符号地址常数,可直接给出数据空间地址,不受 64K 页内偏移限制。 | 可突破 64K 页内限制。 |
| port(k16) | 访问 16 位 I/O 空间,k16 给出 I/O 空间地址。 | 访问 I/O,不是普通数据空间。 |
直接寻址:由 ST1_55 中 CPL 位决定 DP 或 SP
| CPL | 模式 | 23 位有效地址形成 | 适用场景 |
|---|---|---|---|
| 0 | DP 直接寻址 | DPH 高 7 位 + DP 中 9 位页内块号 + 指令 7 位偏移,可理解为 DPH:DP:offset7。 | 全局/静态数据。 |
| 1 | SP 直接寻址 | SPH 高 7 位 + SP 16 位基址 + 指令 7 位偏移相加。重点是 SP + offset7 有加法,不是简单拼接。 | 堆栈局部变量、参数、返回现场。 |
纠错:SP 直接寻址不是形成 30 位地址,最终仍形成数据空间的 23 位有效地址,随后再左移 1 位形成 24 位物理地址。
间接寻址:AR 与双 AR
| 写法 | 含义 |
|---|---|
| *ARn | 访问 ARn 指向的数据存储单元。 |
| *ARn+ | 先使用 ARn 指向的地址,再使 ARn 自增,常用于顺序读数组。 |
| *ARn- | 先使用 ARn 指向的地址,再使 ARn 自减。 |
| *+ARn | 先修改地址,再访问;具体形式受 ARMS 模式限制。 |
- AR0–AR7:8 个辅助寄存器。
- ST2_55 中 ARMS=0:DSP 模式,地址修改方式丰富,适合数据流处理。
- ARMS=1:控制模式,地址修改方式较少。
- 双 AR 间接寻址:可同时通过两个辅助寄存器访问两个数据存储单元。
ADD Xmem, Ymem, AC0 /* AC0 gets Xmem + Ymem */指令并行
| 形式 | 含义 |
|---|---|
| :: | 单条指令内部的隐含并行,指令本身同时完成两个操作。 |
| || | 用户或编译器显式指定两条指令并行执行。 |
| 混合形式 | 内置并行与用户显式并行同时出现。 |
- 两条指令总长度不超过 6 字节。
- 没有运算器、地址产生单元、总线等资源冲突。
- 其中一条具有并行使能位,或两条指令符合软双并行条件。
常见汇编指令识别方法
MOV 搬移,ADD 加法,SUB 减法,MPY 乘法,MAC 乘加,AND/OR/XOR 逻辑运算,B 跳转,CALL 调用,RET/RETURN 返回。
# 表示立即数;*ARn 表示 AR 间接寻址;AC0–AC3 是累加器;T0/T1 是临时寄存器;port(k16) 是 I/O 端口。
*ARn+ 先取数再自增;*ARn- 先取数再自减。
6. 软件设计:C、汇编、COFF、CMD
软件设计从源程序进入编译器、汇编器、链接器,再由 .cmd 文件决定逻辑段落到哪块实际存储器。
开发工具链与裸机程序结构
| 工具 | 作用 |
|---|---|
| 编译器 | 把 C/C++ 源程序转换为汇编语言或目标代码。 |
| 汇编器 | 把汇编源程序转换成目标文件。 |
| 链接器 | 按 .cmd 文件把多个目标文件、库文件和段合成为可执行文件。 |
| 归档器 | 把多个目标文件打包成库,供链接使用。 |
裸机程序通常由初始化、主循环和中断服务程序构成。RTOS 任务状态可了解为休眠、就绪、运行、挂起、被中断。
C55x C 语言类型长度
| 类型或指针 | C55x 长度 | 注意 |
|---|
关键字:ioport / interrupt / onchip / volatile
C 语言优化等级
- -o0:较低级优化,主要进行局部无用代码删除、表达式简化等。
- -o1 / -o2:逐步增强优化。
- -o3:最高级优化,可做函数间、文件级优化,可能内联小函数、删除未使用函数。
- 优化等级越高,优化越强,高等级包含低等级的大部分优化功能。
C 与汇编混合编程
// C 中直接嵌入汇编 asm("BCLR ST1_INTM"); // C 端声明汇编函数 extern int asmfunc(int a, int *p); ; 汇编端符号常加下划线 _asmfunc: ; assembly body RETURN
C 编译器通常不检查嵌入汇编语法和副作用,复杂功能更适合“C 调用独立汇编子程序”。
COFF 段与链接命令文件
| 段名 | 作用 |
|---|
-heap 是链接选项,用于设置动态内存大小;课程中动态内存重点看 .sysmem 段,malloc/free 使用该动态内存池。
CMD 文件:MEMORY 与 SECTIONS
样例结构
-stack 0x1800
-heap 0x0100
-e RESET_ISR
MEMORY
{
PAGE 0:
MMR (RWIX) : origin = 000000h, length = 0000C0h
DARAM0 (RWIX) : origin = 0000C0h, length = 000F40h
SARAM0 (RWIX) : origin = 010000h, length = 010000h
PAGE 2:
IOPORT (RWI) : origin = 000000h, length = 020000h
}
SECTIONS
{
.text > SARAM0
.const > SARAM0
.cinit > SARAM0
.bss > DARAM0
.data > DARAM0
.stack > DARAM0
.sysstack > DARAM0
.sysmem > DARAM0
.ioport > IOPORT PAGE 2
}答题模板
描述芯片或开发板上有哪些物理存储区域,包括区域名称、属性、起始地址 origin/o 和长度 length/l。
描述编译链接生成的逻辑段如何分配到 MEMORY 中声明的物理区域。
起始地址 + 长度不能越过下一个区域起始地址。
.text 常放程序空间或高速 SARAM;.bss/.data/.stack/.sysmem 常放数据 RAM;.ioport 放 I/O 空间 PAGE 2。
7. 片内集成外设
第五章重点是时钟发生器和通用定时器,EMIF、EHPI、McBSP、DMA、GPIO 掌握概念和作用。
时钟发生器:CLKIN → DPLL → CPU/外设时钟
- 从 CLKIN 引脚接收输入时钟。
- 经 DPLL 和分频/倍频电路产生 CPU 与外设工作时钟。
- 可通过 CLKOUT 输出给外部器件。
- 重点寄存器:CLKMD,字段为 PLL ENABLE、PLL MULT、PLL DIV。
- 题目给寄存器表时,先看 PLL ENABLE,再看 MULT/DIV;字段是否 “+1” 按题目表格,课程强调常以字段值 +1 参与计算。
锁定模式:fCPU ≈ fCLKIN × 倍频系数 / 分频系数 旁路模式:PLL 不倍频,输入时钟经旁路分频送入系统
通用定时器模拟器:PSC + TIM
0.01 s
公式:Ttimer = (TDDR + 1)(PRD + 1)Tclk
定时器寄存器与工作过程
| 寄存器 | 作用 |
|---|---|
| PRSC | 预定标寄存器,包含 TDDR 周期字段和 PSC 当前计数字段。 |
| TIM | 16 位主计数器当前值。 |
| PRD | 16 位主周期寄存器,装载给 TIM。 |
| TCR | 定时器控制寄存器,含 TSS 停止位、TLB 装载位、FUNC 工作模式位等。 |
输入时钟 → PSC 递减 → PSC 到 0 → TIM 递减 → TIM 到 0 产生事件
定时器初始化顺序
设置 TSS=1 停止定时器,必要时保存现场或冻结当前计数。
写入预定标周期 TDDR 和主周期 PRD。
设置 TLB=1,把 TDDR → PSC、PRD → TIM。
清除装载请求,设置 TSS=0,启动定时器。
易错:不要理解成“先装载再写周期值”。真正运行的是 PSC/TIM 当前计数器,周期寄存器需要先写好再装载。
EMIF、EHPI、McBSP、DMA、GPIO
| 外设 | 复习要点 |
|---|---|
| EMIF | 连接片外存储器和并行外设:SRAM、ROM、Flash、SBSRAM、SDRAM、并行 A/D、并行 D/A、FPGA、CPLD。C55x 使用 CE[3:0] 片选信号划分不同片外地址空间,减少外部译码逻辑。看图时识别数据线、地址线、片选、读写控制、复位、字节选择信号。 |
| Flash | 非易失,常按异步存储器接口连接,掉电不丢失,写入较慢。 |
| SRAM | 静态随机存储器,访问较快。 |
| SBSRAM | 同步突发静态存储器,支持突发访问,速度高。 |
| SDRAM | 同步动态存储器,容量大,控制更复杂。 |
| EHPI | 增强型主机接口,使外部主处理器可访问 DSP 部分存储空间,用于主机控制 DSP、下载程序、交换数据或产生中断。 |
| McBSP | 多通道缓冲串行口,可配置时钟、帧同步、数据位宽和极性,可模拟 SPI 等串行通信方式。 |
| DMA | 直接存储器访问,不经 CPU 搬运数据,可在存储器与外设、存储器与存储器之间传输,常由事件触发,完成后可中断 CPU。 |
| GPIO | 通用输入输出口,用于简单数字输入输出控制。 |
8. 实验代码与程序分析题
程序分析题不要求逐字默写,而是考查能否读懂代码功能、数据流、初始化、核心循环与输出结果。
程序分析总框架
数组、缓冲区、图像矩阵、端口、寄存器、全局变量。
时钟、定时器、串口、DMA、中断、数组清零、图像读入。
循环次数、索引变化、条件判断、关键运算。
计数器、指针、累加器、阈值、像素值、滤波系数。
完成什么输入处理,生成什么输出结果。
常见实验类型识别
| 类型 | 程序功能分析重点 |
|---|---|
| 输入/输出模拟函数 | 看从哪里读入数据、写到哪个缓冲区、是否模拟外设采样或图像加载。 |
| 直方图统计 | 把灰度值作为下标,对 hist[pixel] 加 1,得到 0–255 灰度频数。 |
| 边缘检测/计数 | 用 Sobel 或类似模板计算梯度,与阈值比较,统计或输出边缘点。 |
| 图像增强 | 看灰度变换、均衡化、滤波、锐化等核心公式和输出数组。 |
| 定时器实验 | 看 TDDR、PRD、TCR 配置,说明定时周期和中断/事件作用。 |
| I/O 端口实验 | 看 ioport 指针或 port(k16),说明读写 I/O 空间而不是普通数据空间。 |
| DMA/McBSP 实验 | 看源地址、目的地址、长度、触发事件和完成中断,说明 CPU 不直接搬运。 |
直方图核心逻辑模板
for (i = 0; i < 256; i++) {
hist[i] = 0;
}
for (i = 0; i < height; i++) {
for (j = 0; j < width; j++) {
gray = image[i][j];
hist[gray]++;
}
}答题说明:先把 256 个灰度级计数清零;再逐像素扫描图像;每读到一个灰度值,就把对应灰度级计数加 1;最终 hist[k] 表示灰度值为 k 的像素个数。
Sobel 边缘检测核心逻辑模板
Gx = -p00 + p02 - 2*p10 + 2*p12 - p20 + p22;
Gy = p00 + 2*p01 + p02 - p20 - 2*p21 - p22;
mag = abs(Gx) + abs(Gy);
if (mag > threshold) {
out[i][j] = 255;
} else {
out[i][j] = 0;
}答题说明:用邻域模板计算水平和垂直方向灰度变化,变化越大越可能是边缘;再用阈值区分边缘点和非边缘点,输出二值边缘图或统计边缘数量。
9. 高频易错点翻卡
点击卡片查看正确理解。这里集中覆盖判断题、填空题和简答题中最容易混淆的表述。
10. 考前最小背诵清单与覆盖矩阵
下面的 15 条是最小背诵清单;后面的覆盖矩阵用于确认本 Web App 没有漏掉资料目录中的 TMS320C55x 知识点。