TMS320C6713B: 应用程序代码段放在CE0 SDRAM,堆栈、变量段放入片内SRAM,使能L2 Cache程序不能正常跳转运行

Part Number: TMS320C6713B

因片内存储空间不够,将应用程序程序代码段放在CE0 SDRAM,堆栈、变量段放入片内SRAM,使能64KB的L2 Cache,程序未占用L2 Cache空间。

Cache使能在PLL、EMIF接口初始化配置完成后,Cache使能配置过程如下:

CACHE_setL2Mode(7);

CACHE_enableCaching(CACHE_CE00);

测试发现程序不能正常启动,去掉Cache使能可正常启动,或将程序均放入片外SDRAM也可以正常启动。请教Cache使能配置过程是否正确,为什么片内、片外分别存放程序会出现不能正常跳转运行的情况?

  • 您好,收到了您的案例,调查需要些时间,感您的耐心等待。

  • 你好

    C6713 仅提供有限支持,我们无法提供任何深入的帮助。

    以下是我们内部人工智能助手工具的回复,请看看是否有帮助。

    --

    问题一:L2缓存占用SRAM

    当你打电话时CACHE_setL2Mode(7)这样配置了 64KB 的 4 路 L2 缓存——但这 64KB 是从内部 L2 内存空间的顶部取出的。具体来说,是地址0x0003_0000通过0x0003_FFFFSRAM 中的数据被转换为缓存块,仅剩下 192KB 可用 SRAM (0x0000_00000x0002_FFFF)[1][2]。

    如果你的堆栈或变量放置在任何位置0x0003_0000–0x0003_FFFF启用缓存会立即损坏数据段。链接器在 256KB 内存全部可用(SRAM 为 7)时分配了这些数据段,但启用 L2 缓存模式 7 会悄悄地回收高 64KB 内存。

    这是你的程序无法启动的最可能原因——启用缓存的瞬间堆栈就被销毁了,导致分支目标错误和执行失败。

    问题 2:采用分离式内存布局时的缓存一致性

    第二个问题涉及处理器如何处理从外部 SDRAM 获取代码。默认情况下,即使启用了 L2 缓存,外部存储器也不会被标记为可缓存[3]。缓存性是通过内存属性寄存器(MAR0–MAR3,地址)单独控制的。0x018482000x0184820C )[4]。

    什么时候CACHE_enableCaching(CACHE_CE00)CE0 被标记为可缓存,从 SDRAM 获取的指令会被缓存到 L2 缓存中。然而,L1P(程序缓存)和 L1D(数据缓存)之间并非硬件一致——L1P 在获取指令时不会查询 L1D [5]。如果不在模式切换期间显式地使 L1P 和 L1D 缓存失效(CCFG 寄存器中的第 9 位和第 8 位),则过期的缓存条目会导致处理器跳转到错误的地址 [5][6]。


    其他配置为何有效

    配置
    为什么有效
    缓存已禁用
    所有 256KB 空间仍保留为 SRAM。堆栈/变量完好无损。不存在一致性问题。
    整个程序都在外部SDRAM中运行
    堆栈和变量也位于 SDRAM 中,因此不会占用被转换为缓存的 L2 SRAM 高层区域。所有访问都遵循相同的缓存策略。
    分屏布局 + 启用缓存
    失败——高位 SRAM 中的堆栈/变量被缓存块覆盖,一致性问题加剧了这个问题。

    如何解决这个问题

    1. 将堆栈和变量移至下方0x0003_0000在你的链接器命令文件中。当 L2MODE=7 时,仅地址0x0000_00000x0002_FFFF(192KB)对 SRAM 使用是安全的[1][2]。

    2. 在更改 L2 模式之前或之后立即使 L1P 和 L1D 无效——在 CCFG 寄存器中设置位 9(IP)和 8(ID)[6]。

    3. 验证 MAR 寄存器配置— 确认 MAR0–MAR3 已正确设置,以将 CE0 SDRAM 标记为代码段可缓存。使用 CCS [4] 在运行时检查这些寄存器。

    正确的序列应该是:

    // 确保堆栈/变量位于 0x0003_0000 以下的 SRAM 中
    CACHE_setL2Mode(7); // 64KB 缓存,192KB SRAM
    // 使 L1P 和 L1D 失效
    CACHE_enableCaching(CACHE_CE00); // 通过 MAR 将 CE0 标记为可缓存

    为了完善这项建议,了解以下信息将很有帮助:

    • 你的链接器命令文件(.cmd显示堆栈的确切内存区域位置,.bss , 和.text
    • 初始化期间是否有任何 DMA(EDMA)操作访问 CE0 SDRAM
    • 您的设置代码中是否也修改了 L1P 和 L1D 缓存配置?

    1. TMS320C621x/C671x 两级内部存储器参考指南 — L2 缓存模式(图 8)
    2. TMS320C6713B 数据手册 — L2 存储器配置(图 2)
    3. TMS320C621x/C671x 两级内部存储器参考指南 — L2 模式选择
    4. TI E2E:DSP/BIOS 访问 CE0 内存空间时出现问题
    5. TMS320C621x/C671x 两级内部存储器参考指南 — 存储器系统策略
    6. TMS320C621x/C671x 两级内部存储器参考指南 — CCFG 寄存器(表 4)