1. 项目概述与迁移价值
在嵌入式DSP开发领域,硬件平台的迭代升级是家常便饭,但每一次升级背后都意味着一次严谨的工程评估与迁移实践。最近,我接手了一个老项目的硬件平台升级任务,核心是将原有的TMS320VC5420 DSP替换为功能更强大的TMS320VC5421。这可不是简单的“换个芯片”就能搞定的事情,从内存布局到外设配置,再到启动流程,处处都藏着“坑”。经过一番折腾,总算把迁移的关键点和避坑经验梳理清楚了。如果你也正面临从VC5420到VC5421的迁移,或者对双核C54x DSP的内部机制感兴趣,这篇笔记或许能帮你少走不少弯路。
简单来说,VC5421可以看作是VC5420的增强版,两者同属TI的TMS320C54x系列,指令集兼容,这让软件迁移有了基础。但VC5421在内存容量、外设灵活性和系统架构上做了显著改进。最直观的好处是,VC5421提供了更大的片上RAM(256K字 vs. 200K字),并且内置了Bootloader ROM,这能省掉外部存储器和复杂的HPI启动代码,对于降低成本、简化设计、提升启动可靠性意义重大。然而,这些增强功能也带来了内存映射重整、外设寄存器位定义变化、以及总线访问仲裁机制的不同。迁移的核心,就在于透彻理解这些“不同但兼容”或“必须修改”的差异点,并据此调整你的硬件设计和软件代码。
2. 核心差异总览与迁移策略
在深入每个模块之前,我们先从全局视角看看VC5421相比VC5420到底有哪些关键变化。根据TI的官方迁移文档(SPRA621),这些差异被标记为三类,这也是我们制定迁移策略的路线图:
- [S] 软件修改:这意味着芯片功能有变化,但硬件引脚和连接可能无需改动,主要靠修改软件配置、驱动或内存分配来适配。这是最常见的迁移类型。
- [H] 硬件修改:这通常涉及引脚功能变更或新增引脚,必须修改PCB布局或电路连接,否则系统可能无法正常工作。
- [D] 差异但兼容:指VC5421增加了新功能或特性,但这些变化不会影响VC5420原有代码的运行。你可以选择不使用新功能,系统仍能工作;若要利用新功能,则需修改软件。
我们的迁移工作,基本就是围绕处理这些[S]和[H]类差异展开的。下面这张表帮你快速抓住重点:
| 差异类别 | 影响模块 | VC5420 | VC5421 | 迁移关键动作 |
|---|---|---|---|---|
| [S] | 内存结构 | 总计200K字RAM, 两个子系统各有独立内存。 | 总计256K字RAM, 引入128K字共享DARAM。 | 重写CMD链接文件,区分本地与共享内存空间;注意CPU对共享内存只有读权限。 |
| [S] | DMA/HPI内存映射 | DMA只能访问片内存储空间。 | DMA可访问全部片内和片外存储空间,映射地址与CPU视图不同。 | 调整DMA传输的源/目标地址;理解DMA与CPU视角的地址转换关系。 |
| [D] | McBSP采样率发生器 | 时钟源仅限内部CPU时钟或CLKS引脚(通常不可用)。 | 新增时钟源选项:BCLKR或BCLKX引脚。 | 如需外部时钟驱动SRG,需利用新功能,配置PCR.SCLKME和SRGR2.CLKSM位。 |
| [D] | McBSP多通道模式 | 仅支持32通道(A/B分区)。 | 新增128通道模式(A-H分区)。 | 如需超过32通道,需设置MCR1x.RMCME和MCR2x.XMCME,并配置新增的RCERyz/XCERyz寄存器。 |
| [D] | Bootloader | 无片内Bootloader,必须通过HPI或用户自定义外部Bootloader启动。 | 内置2K字Bootloader ROM,支持并行8/16位、串行EEPROM等多种启动模式。 | 利用片内Bootloader简化设计;注意其不能直接加载数据段到数据空间。 |
| [H] | HOLD/HOLDA引脚 | 无HOLD/HOLDA引脚,有一个VCO引脚。 | 新增HOLD/HOLDA引脚,用于外部总线请求;HOLDA复用原VCO引脚。 | 检查原VCO引脚用途,修改电路设计以适应HOLD/HOLDA功能。 |
| [H] | SELA/B/PPA18引脚 | 在HPI模式下为输入引脚。 | 在XIO模式(XIO=1)下,该引脚变为地址输出PPA18。 | 评估该引脚在目标模式下的方向,避免信号冲突,可能需要增加缓冲或调整连接。 |
| [D] | 芯片子系统ID寄存器 | 无此寄存器。 | 新增CSIDR寄存器,可读取芯片ID、修订版和子系统标识。 | 可用于软件识别芯片型号和子系统,实现单份代码适配不同硬件。 |
| [S] | DMA/XIO仲裁 | DMA不支持外部访问,无复杂仲裁。 | DMA支持外部访问,且两个子系统的CPU和DMA共享外部总线,需仲裁。 | 理解仲裁优先级(DMA > XIO),注意HOLD会等待DMA完成;避免DMA长时间阻塞CPU访问。 |
迁移心法第一条:先硬件,后软件。务必先对照原理图,把所有[H]类引脚差异处理干净,确保硬件平台正确。在这个基础上,再着手进行[S]类软件修改,否则软件调试图同大海捞针。
3. 内存结构重塑与软件适配详解
内存是DSP的“工作台”,它的变化直接影响所有程序的生死。VC5421的内存架构改动是本次迁移中最需要警惕的[S]类项目。
3.1 内存容量与布局的质变
VC5420每个DSP核心(子系统)拥有:16K字DARAM(可映射为程序/数据)、16K字SARAM(数据)、36K字SARAM(程序)以及4K字SARAM(程序/数据),总计每个核心72K字,两个核心共144K字片内RAM,外加一些其他存储,总计约200K字。
VC5421则进行了大刀阔斧的改革:
- 每个子系统:32K字本地DARAM(程序/数据) + 32K字本地SARAM(仅数据)。
- 共享内存:128K字DARAM(仅程序),被两个核心共享。
- Boot ROM:每个子系统2K字ROM。
核心变化在于引入了128K字的“共享DARAM”。设计初衷很明确:当双核运行相同代码时,这份代码只需在共享内存中存一份,两个核心都能读取,极大地提高了内存利用率。但这里有一个至关重要的限制:CPU核心对这片共享内存只有读取权限,不能直接写入。所有对共享内存的写操作,必须通过DMA控制器或HPI接口来完成。这个设计是为了防止一个核心无意中覆盖掉另一个核心正在执行的程序代码,是一种硬件级的保护机制。
3.2 链接命令文件(CMD)的重构实战
内存布局变了,告诉编译器链接器“代码和数据放哪里”的CMD文件必须重写。以TI CCS环境为例,VC5420和VC5421的CMD文件结构会有显著不同。
假设我们有一个双核通信应用,核心A和核心B需要共享一段公共系数表和数据缓冲区。在VC5420上,你可能需要分别在两个核心的SARAM中定义同名但地址不同的段,软件通过核间通信机制来同步数据,效率低且易出错。
迁移到VC5421后,我们可以利用共享内存。以下是一个简化的VC5421 CMD文件片段示例,展示了如何划分内存区域:
/* VC5421 - Core A Linker Command File (core_a.cmd) */ MEMORY { PAGE 0: /* Program Memory */ VECS_A: origin = 0x0080, length = 0x0080 /* 中断向量表 - 各核心独立 */ PRAM_A: origin = 0x0100, length = 0x7E00 /* 核心A本地程序DARAM */ SHARED_P: origin = 0x8000, length = 0x20000 /* 共享程序DARAM (128K) - CPU只读 */ /* 外部ROM/FLASH地址... */ PAGE 1: /* Data Memory */ DRAM_A: origin = 0x0800, length = 0x7800 /* 核心A本地数据DARAM */ SARAM_A: origin = 0x8000, length = 0x8000 /* 核心A本地数据SARAM (32K) */ /* 外部RAM地址... */ } SECTIONS { .vectors: > VECS_A PAGE 0 .text: > PRAM_A PAGE 0 /* 核心A私有代码 */ .cinit: > PRAM_A PAGE 0 .switch: > PRAM_A PAGE 0 /* 将需要共享的只读常量(如滤波器系数)放入共享内存 */ .const: > SHARED_P PAGE 0 /* 将需要共享的程序代码(如公共算法库)放入共享内存 */ .shared_code: > SHARED_P PAGE 0 /* 注意:此段代码必须位置无关或使用同一地址 */ .bss: > DRAM_A PAGE 1 .data: > DRAM_A PAGE 1 .stack: > SARAM_A PAGE 1 .sysmem: > SARAM_A PAGE 1 /* 定义一个段,用于存放需要通过DMA写入共享内存的数据 */ .shared_data: > SHARED_P PAGE 0 /* 链接器将其放在共享区,但实际初始化需通过DMA */ }对于核心B的CMD文件,VECS_A、PRAM_A、DRAM_A、SARAM_A需要改为核心B对应的本地内存地址(在内存映射图中,核心B的本地内存地址范围与核心A不同)。但SHARED_P的地址范围是相同的,这保证了双核看到的是同一块共享程序空间。
关键操作解析:
- 区分本地与共享:将双核都需要访问的只读数据(
.const)和公共库代码(.shared_code)明确分配到SHARED_P区域。 - 共享数据初始化:对于需要共享的初始化数据(如
.shared_data),链接器可以将其分配到共享内存,但你不能用传统的memcpy在启动时初始化。正确的做法是:在核心A的启动代码中,使用DMA将初始化数据从外部Flash或本地内存搬运到共享内存的对应地址。核心B启动后,就能直接读取这些已初始化的数据。 - 地址一致性:确保两个核心的工程中,对共享内存段的定义(ORIGIN和LENGTH)完全一致,否则会导致地址错乱,读取错误。
踩坑记录:共享内存写入陷阱。最初迁移时,我试图在核心A的代码中直接对一个位于共享内存的全局变量赋值,结果程序跑飞。排查了半天才发现是触发了硬件保护。务必牢记:CPU不能直接写共享内存!任何对共享内存的写操作,必须封装成DMA传输请求。一个实用的做法是,为共享内存区定义一个 volatile 指针,但写操作函数内部调用DMA API。
3.3 DMA与HPI内存映射的视角转换
如果说CPU内存映射是“程序员视图”,那么DMA/HPI内存映射就是“搬运工视图”。在VC5420上,DMA的视野局限在片内,而VC5421的DMA则拥有了“上帝视角”,可以访问所有内存空间,包括片外存储。
迁移带来的主要挑战是地址转换。同一个物理内存块,在CPU、DMA和HPI眼中,地址可能不同。例如,附录B的映射图清晰显示,CPU看到的共享内存块“Shared 0”在程序空间地址0x008000,而DMA看到它的地址可能在0x010000。
软件适配步骤:
- 更新DMA配置表:所有在VC5420上配置的DMA传输,如果涉及VC5421上地址变更的内存块(尤其是新增的共享内存和扩展的访问范围),必须根据VC5421的DMA内存映射表(见文档附录B的图B-3, B-4, B-5)重新计算源地址和目的地址。
- 统一地址管理:在软件中,最好为常用的内存区域(如共享缓冲区)定义宏或常量,并区分CPU_ADDR和DMA_ADDR。例如:
#define SHARED_BUFFER_CPU_ADDR 0x8000 /* CPU视角的读地址 */ #define SHARED_BUFFER_DMA_ADDR 0x10000 /* DMA视角的读写地址 */ - HPI主机驱动更新:如果上位机通过HPI加载代码或数据,主机端的驱动软件也需要更新,使用VC5421 HPI内存映射(图B-7)而非VC5420的映射(图B-8)来计算访问地址。
4. 外设功能增强与配置迁移
VC5421的外设,特别是McBSP,增加了非常实用的灵活性,属于[D]类差异。这意味着旧代码可以不加修改地运行(使用兼容模式),但如果你想发挥新芯片的全部威力,就需要进行适配。
4.1 McBSP采样率发生器时钟源扩展
在VC5420及更早的C54x器件上,McBSP的采样率发生器(SRG)时钟源通常只能选择内部CPU时钟,因为CLKS引脚在很多封装上不存在。这在需要与外部精确时钟同步的应用中非常受限。
VC5421通过新增一个引脚控制寄存器(PCR)的位7(SCLKME),与原有的SRGR2.CLKSM位配合,将BCLKR和BCLKX这两个双向引脚也纳入了SRG时钟源选项。
配置流程与示例: 假设我们需要McBSP0的采样率由外部设备提供的BCLKX0引脚时钟驱动。
- 确定时钟源:选择
BCLKX作为输入。查表可知,需设置SCLKME = 1,CLKSM = 1。 - 配置PCR寄存器:首先需要将BCLKX0引脚设置为输入(通常CLKXM=0时,BCLKX为输入)。然后设置SCLKME位。
// 假设 McBSP0 寄存器基地址为 0x20 volatile ioport unsigned int *mcbsp0_pcr = (unsigned int *)0x0020; // 读取当前PCR值,清除并设置相关位 unsigned int pcr_val = *mcbsp0_pcr; pcr_val &= ~(0x8080); // 清除CLKXM(位8)和SCLKME(位7) // 设置CLKXM=0 (输入), SCLKME=1 (增强模式,选择BCLKX/BCLKR) pcr_val |= 0x0080; *mcbsp0_pcr = pcr_val; - 配置SRGR2寄存器:设置CLKSM位。
volatile ioport unsigned int *mcbsp0_srgr2 = (unsigned int *)0x0024; // 假设地址 unsigned int srgr2_val = *mcbsp0_srgr2; srgr2_val |= 0x2000; // 设置CLKSM位 (第13位) *mcbsp0_srgr2 = srgr2_val; - 配置其他SRG参数:根据BCLKX输入的频率和所需的采样率,设置SRGR1和SRGR2中的分频器(CLKGDV, FPER等)。
注意事项:当BCLKX或BCLKR被配置为SRG时钟输入时,其输出缓冲器会被自动禁用。这意味着你不能同时将该引脚用于时钟输出。在设计硬件连接时,要确保外部时钟源能够驱动这个引脚。
4.2 128通道多通道选择模式
VC5420的McBSP最多支持32个时分复用通道(A、B两个分区,各16通道)。VC5421将这个能力扩展到了128通道(A-H八个分区)。
启用128通道模式:
- 设置多通道控制寄存器MCR1x的RMCME位为1,启用接收端128通道模式。
- 设置多通道控制寄存器MCR2x的XMCME位为1,启用发送端128通道模式。
// 配置McBSP1启用128通道模式 volatile ioport unsigned int *mcbsp1_mcr1 = (unsigned int *)0x0042; // 假设地址 volatile ioport unsigned int *mcbsp1_mcr2 = (unsigned int *)0x0043; // 假设地址 *mcbsp1_mcr1 |= 0x0400; // 设置RMCME位 (第9位) *mcbsp1_mcr2 |= 0x0400; // 设置XMCME位 (第9位) - 配置新增的通道使能寄存器:128通道模式使能后,除了原有的RCERAx/Bx和XCERAx/Bx(用于A、B分区),你还需要使用新增的RCERCx~RCERHx和XCERCx~XCERHx寄存器(x为McBSP编号0,1,2)来使能C到H分区。这些寄存器的子地址需要在VC5421的数据手册中查询。你需要像操作标准外设寄存器一样,通过正确的地址去读写它们,以精确控制哪128个通道中的哪些是有效的。
迁移策略:如果你的VC5420代码只使用了32通道以内的功能,那么迁移到VC5421后,只需保持RMCME/XMCME=0,原有对RCERAx/Bx和XCERAx/Bx的配置代码完全无需改动,即可正常运行。这是“向下兼容”的完美体现。只有当你的新应用需要超过32通道时,才需要启用并配置这个新特性。
5. 启动流程的革命:片内Bootloader
这是VC5421一个极具吸引力的[D]类增强功能。VC5420没有片内Bootloader,系统上电后,要么通过HPI由主机处理器加载程序,要么需要用户自己编写一个Bootloader程序,并和应用程序一起存放在外部非易失性存储器(如Flash)中。后者增加了开发复杂性和成本。
VC5421在每个子系统内部集成了2K字的Bootloader ROM。复位后,如果满足条件(XIO=1且ROMEN/GPIO0=1),CPU会自动从这片ROM开始执行,从而可以自动从外部并行Flash、串行EEPROM等设备加载用户程序到片内RAM中。
Bootloader模式配置: Bootloader的模式选择通常由芯片的特定引脚(如BOOTMODE[2:0])在上电复位时的电平状态决定。你需要查阅VC5421的具体数据手册,连接好对应的上拉/下拉电阻,以选择所需的启动模式,例如:
- 并行16位模式:从外部16位异步存储器(如Flash)加载。
- 并行8位模式:从外部8位异步存储器加载。
- 串行EEPROM模式:通过McBSP2从串行EEPROM加载。
对软件工程的影响:
- 简化设计:省去了编写和调试自定义Bootloader的步骤,也减少了外部存储器的容量需求(不再需要存储Bootloader代码)。
- 生成引导表:你的应用程序代码需要被转换成Bootloader能够识别的格式,通常是一个包含长度、目的地址、数据内容的“引导表”。TI的编译器工具链(如hex500或armhex)提供了生成这种引导表的选项。
- 数据段处理:如文档所述,Bootloader不能直接加载数据段(.data, .bss等)到数据空间。有两个常用解决方案:
- 方案A:将初始化数据放在程序空间,在应用程序的
c_int00(C环境初始化)开始部分,自己编写一段代码,将数据从程序空间复制到数据空间。这需要你在CMD文件中妥善安排.data段的位置。 - 方案B:利用DARAM既可映射为程序空间也可映射为数据空间的特性,将需要初始化的数据段直接链接到DARAM中(作为程序空间),这样Bootloader就能将其加载进去。上电后,通过设置PMST寄存器的OVLY位,可以将这部分DARAM同时映射到数据空间,从而直接访问。
- 方案A:将初始化数据放在程序空间,在应用程序的
迁移操作:对于从VC5420(无Bootloader)迁移来的项目,如果你想启用VC5421的片内Bootloader,需要:
- 硬件上配置好Boot模式选择引脚。
- 修改链接命令文件,处理好程序段和数据段的布局,特别是数据段的初始化策略。
- 使用工具生成正确的引导表,并烧写到外部启动设备(如Flash)的起始位置。
- 在软件初始化代码中,移除或修改原先通过HPI加载或自定义Bootloader的代码。
6. 硬件引脚变更与电路设计调整
[H]类差异是迁移中最“硬”的部分,必须修改PCB或至少调整电路连接。
6.1 HOLD/HOLDA引脚处理
VC5421新增了HOLD/HOLDA总线保持功能。关键是,HOLDA信号复用了VC5420上的VCO引脚。因此,你必须检查原VC5420设计中VCO引脚是如何使用的。
- 如果VCO引脚悬空或未使用:那么迁移最简单,将VC5421的HOLD引脚根据需求接上拉电阻或连接到外部主设备,HOLDA引脚可以连接到外部主设备作为应答,或者悬空(如果不用此功能)。
- 如果VCO引脚被用作其他功能(例如,连接到一个时钟源或作为GPIO):这就麻烦了。你需要评估这个功能是否必须,如果必须,则可能需要在VC5421上寻找另一个替代引脚,或者修改系统设计,放弃HOLD/HOLDA功能(通过配置让该引脚不作为HOLDA输出)。如果原功能不重要,则可以移除相关电路,启用HOLD/HOLDA。
6.2 SELA/B/PPA18引脚的方向性
这个引脚在VC5420上始终是输入(在HPI模式下选择主机访问哪个子系统)。在VC5421上,当芯片工作在XIO模式(即使用外部存储器接口,XIO=1)时,该引脚变成了地址线输出PPA18。
硬件设计检查:
- 确认工作模式:你的系统主要使用HPI模式还是XIO模式?如果是HPI模式(XIO=0),该引脚仍是输入,原有设计可能兼容。
- XIO模式下的冲突:如果在XIO模式下,原电路将该引脚连接到了一个输出设备(比如另一个器件的输出脚),就会发生信号冲突,可能导致引脚损坏或系统不稳定。必须修改电路,确保在XIO模式下,该引脚连接的是高阻抗输入(如Flash的地址线)或者通过缓冲器隔离。
- 建议做法:在原理图设计阶段,即使当前计划用HPI模式,也最好按照XIO模式(即PPA18输出)来设计连接,将其连接到外部存储器的地址线,并预留上下拉电阻。这样设计更具灵活性,未来模式切换无忧。
7. 系统级考量:DMA/XIO仲裁与核心间协作
VC5421允许两个子系统的DMA访问外部存储器和所有片内存储器,这带来了强大的数据搬运能力,也引入了复杂的总线仲裁问题。
7.1 仲裁机制详解
在VC5421中,外部总线(XIO)是一个共享资源,两个CPU(XIO_A, XIO_B)和两个DMA(DMA_A, DMA_B)都需要使用它。仲裁规则如下:
- 优先级:DMA请求的优先级高于CPU的XIO请求。这意味着当DMA需要进行外部传输时,它会优先获得总线。
- 无突发传输:为了防止单个DMA通道长时间独占总线,导致另一个CPU或HOLD请求被“饿死”,VC5421的DMA不支持突发传输。每个外部总线周期(读或写一个字)后,都会重新进行仲裁。
- 仲裁粒度:仲裁发生在每个外部总线周期。即使一个DMA通道有一个很长的传输列表,它也是传输一个字,释放总线,再仲裁,再传输下一个字。这保证了系统的实时响应性。
- HOLD处理:当外部主设备拉低HOLD引脚请求总线时,VC5421不会立即响应HOLDA。它会等待当前正在进行的DMA外部传输周期完成,然后再释放总线并拉低HOLDA。这意味着如果你的DMA正在进行大量外部访问,HOLD响应会有延迟。
- CPU间仲裁:两个CPU之间对XIO控制权的仲裁,需要通过软件请求/许可机制。CPU在访问XIO前,需要设置GPIO控制寄存器的XIO_REQ位来请求总线,并轮询XIO_GRANT位直到获得许可。如果两个CPU同时请求,子系统A有优先级。
7.2 软件设计策略与避坑指南
理解上述仲裁机制后,在软件设计上就要特别注意:
- 避免DMA长时间阻塞:虽然DMA优先级高,但因为它不支持突发,单个长传输会被频繁打断。然而,如果一个DMA通道被配置为高频率、连续地请求外部传输(例如,从一个慢速外部ADC不断读取数据),它仍然会严重占用总线带宽。优化策略是尽量使用片内内存进行数据缓冲。让DMA将一批数据从外部搬入片内缓冲区,CPU再处理这片缓冲区,而不是让DMA和CPU频繁交替访问外部设备。
- 合理规划DMA通道:每个子系统最多只能有两个DMA通道用于外部访问(一个读,一个写)。在双核系统中,总共就是4个外部DMA通道。需要根据数据流的重要性,合理分配这些通道。
- CPU访问外部设备的延迟:在编写CPU直接访问外部存储器(如Flash、SDRAM)或外设的代码时,要意识到这种访问可能会被DMA请求插入等待状态。如果代码对时序有严格要求,可以考虑在关键段暂时禁用DMA的外部访问权限,或者使用更高优先级的CPU XIO请求(但要注意CPU间的仲裁)。
- HOLD响应时间:如果你的系统需要支持其他主设备(如另一个处理器)通过HOLD/HOLDA来请求总线,必须评估在最坏情况下(DMA满负荷外部传输)的HOLDA响应延迟,确保满足外部设备的时序要求。
一个常见的调试场景:你发现系统偶尔会“卡顿”,特别是当DMA活跃时,CPU读取外部Flash中的指令或数据变慢。这很可能就是总线仲裁导致的。解决方法是通过性能分析工具(如CCS的Profiler)或软件时间戳,测量DMA活动期间关键任务的执行时间,并优化DMA的传输策略,比如合并传输请求、使用更大的片内缓冲区等。
8. 迁移实操检查清单与问题排查
最后,我将整个迁移过程浓缩成一个可操作的检查清单,并附上几个我实际遇到过的典型问题及解决方法。
8.1 硬件迁移检查清单
- [ ]引脚复查:对照VC5421和VC5420的引脚定义图,逐一检查所有功能引脚,特别是标记为[H]的引脚(HOLD/HOLDA, SELA/B/PPA18)。
- [ ]电源与时钟:确认VC5421的电源轨(核心电压、I/O电压)和时钟输入要求与VC5420一致或已按新数据手册调整。
- [ ]Boot模式配置:根据选择的启动方式(如并行Flash),正确配置BOOTMODE等引导相关引脚的上拉/下拉电阻。
- [ ]存储器接口:如果使用外部存储器,确认地址线(特别是PPA18)、数据线和控制线的连接与VC5421的XIO模式兼容。
- [ ]未连接引脚:妥善处理VC5421上新增的或功能变更的引脚,根据数据手册建议接上拉/下拉电阻或保持悬空。
8.2 软件迁移检查清单
- [ ]链接命令文件:基于VC5421的内存映射,重写两个核心的CMD文件,清晰划分本地内存、共享内存和外部内存区域。
- [ ]启动代码:移除或禁用原有的HPI加载或自定义Bootloader代码。如果使用片内Bootloader,确保应用程序的引导表已正确生成和烧录。
- [ ]DMA驱动:审查所有DMA传输配置,根据VC5421的DMA内存映射表更新源地址和目标地址。特别注意共享内存的DMA访问地址。
- [ ]外设初始化:检查McBSP、Timer等外设的初始化代码。如果使用新功能(如128通道模式、外部SRG时钟),则添加相应配置。
- [ ]核心间通信:如果原系统使用核间中断或共享存储器通信,确保在新的内存布局下,通信缓冲区的地址对于双核是正确的(特别是使用共享内存时)。
- [ ]芯片识别(可选):在初始化代码中,可以添加读取CSIDR寄存器的逻辑,以识别芯片型号和子系统,实现代码的通用性。
8.3 常见问题与排查实录
问题一:程序在VC5421上跑飞,但在VC5420上正常。
- 排查:首先怀疑内存映射。检查CMD文件,确认代码段和数据段没有意外地被链接到了VC5421上CPU不可写或地址无效的区域(例如,试图将可写数据段链接到“共享程序DARAM”)。使用CCS的内存查看器,检查程序计数器(PC)跑飞时指向的地址是否在有效的程序内存范围内。
- 解决:仔细核对VC5421的CPU内存映射图,修正CMD文件中各段的
origin和length。确保.bss,.data,.stack等可写段只位于本地DARAM或SARAM中。
问题二:双核通信数据错乱。
- 排查:原VC5420设计可能使用核A的某块SARAM作为邮箱,核B通过HPI或特定的映射地址来访问。迁移到VC5421后,这块内存的物理地址或访问权限可能已改变。
- 解决:利用VC5421的共享内存作为通信缓冲区。在CMD文件中为通信缓冲区定义一个位于共享内存区域的段(如
.shared_mailbox)。核A通过DMA将数据写入该段的DMA地址,核B直接从对应的CPU地址读取。确保双核工程中对该段的地址定义完全一致。
问题三:启用片内Bootloader后,程序无法启动。
- 排查:
- 检查Boot模式引脚的上电状态,用示波器或逻辑分析仪确认配置正确。
- 检查外部启动设备(如Flash)中引导表的格式和内容是否正确。确认引导表的头信息(宽度、入口点等)符合Bootloader规范。
- 检查应用程序的初始化代码(
c_int00),是否正确地复制了.data段到数据空间(如果采用方案A)。单步调试,看程序在执行完Bootloader后,是否跳转到了正确的用户程序入口。
- 解决:使用TI的
hex6x工具生成引导表时,仔细检查命令行参数,特别是-boot相关的选项。在CCS中,可以加载.out文件后,通过Memory Browser查看Bootloader加载后,内存内容是否符合预期。
- 排查:
问题四:系统运行一段时间后,出现随机错误或DMA传输失败。
- 排查:这很可能是总线仲裁或内存访问冲突导致的。检查是否有多个主设备(CPU_A, CPU_B, DMA_A, DMA_B)在无协调的情况下频繁竞争访问同一片外部存储区域。
- 解决:引入软件信号量或硬件互斥机制来管理对共享外部资源(如一片公共的SDRAM)的访问。优化DMA传输,使用乒乓缓冲区,减少单次DMA传输占用总线的时间。如果可能,将频繁访问的数据移至片内RAM。
迁移完成后的系统测试,建议分步进行:先确保单个核心能独立运行基本功能;再测试双核独立运行;最后测试双核通信与协作。每一步都充分利用仿真器和逻辑分析仪,观察内存、总线和关键信号的状态,这样才能稳稳地将你的系统从VC5420平台过渡到更强大的VC5421平台。