This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] TMS320F28075:RAM 构建:从 Code Composer Studio (CCS)加载到 RAM GS1的.text 不正确

Guru**** 2024750 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1108031/tms320f28075-ram-builds-incorrect-text-loaded-to-ram-gs1-from-code-composer-studio-ccs

器件型号:TMS320F28075

您好!  

我们的团队喜欢将 RAM 构建用于我们的开发、因为编程周期时间 比闪存构建快得多。

遗憾的是、我看到 RAM 中的内容与我在反汇编.out 文件时看到的运算代码不匹配的问题。

例如:

在此示例中、我在链接器中将 RAMGS1 (地址0xD000)配置为.text 扇区。

Fullscreen
1
.text : >> RAMGS1_3 | RAMGS4_7 | RAMLS4 | RAMLS5 | RAMD0_1, PAGE = 0, ALIGN(8)
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

奇怪的是、即使我更改了.text ram 链接器中扇区的顺序并将函数存储在 RAM 中、位于0xd000和0xd001的代码看起来也是一样的。  在程序运行到 main()之前,我已经验证了程序加载时 RAM 内容是否损坏。  即在 _c_int00处

CCS 在将.out 文件加载到 RAM 时是否执行优化?  什么 可能导致 dis2000输出与我在 CCS 中看到的结果不匹配?

-科林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Colin、

    与.out 拆分的代码应与通过 JTAG 加载到器件中的代码匹配。  

    在查看上面的拆分装配体之前、您是否可以确保已运行到主程序?  

    作为 C Init 的一部分、有一些指令会影响 C28x 内核解释某些运算代码的方式(为了实现向后兼容性)、如果我们在执行此操作之前查看拆分、它可能会解释差异。

    最棒的

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthew、

    感谢您的快速响应。  我已经尝试过、结果是相同的。  这就是我最初确定问题的方式、因为系统没有执行启用 ISR 的函数。

    您对我还可以尝试什么有任何建议吗?  是否有任何方法可以添加额外的日志记录以查看仿真器正在加载到闪存中的内容?  


    -科林   

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Colin、

    当您通过 CCS 加载代码时、您是使用调试按钮启动/加载/等活动项目、还是手动连接到目标、然后使用 Run->Load->Load Program、然后选择.out 文件?

    如果将内存浏览器打开到同一位置(0xD000)、内容是否与拆分窗口中第二列中的内容相匹配?

    假设这是"是"、如果刷新存储器窗口、您是否会看到内容发生变化?

    最棒的
    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我使用了调试按钮和“Run->Load->Select Program to Load->*.out”过程。  我使用的是 CCS 11.2.0.00007和 CDT 21.6.0.0。

    内存浏览器和拆分程序集显示相同的操作代码内容。 下面的屏幕截图显示了刷新后的拆分和存储器内容以及.out 文件的拆分。  (这是通过调试按钮获取的...但加载选项没有变化)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Colin、

    感谢您这么做、我不会过多地使用反汇编器、但一旦编译.out、有关器件的代码加载的任何内容都不应更改内容。

    您能否附加在构建项目时生成的.map 文件、这将帮助我了解正在播放的存储器区域以及是否有任何相邻的存储器使用情况。  如果存在存储器超运行问题、链接器应该不会继续、如果存在栈超运行或超运行/过写入存储器指针、我们通常会看到什么情况。  因为在代码加载时、在 main 之前、情况不应如此。

    您能否打开"Registers"选项卡并找到 SP (内核寄存器下的堆栈指针)、让我知道当您读取存储器时读取的内容?

    最棒的

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matthew、

    我很难在 E2E 论坛中上传地图文件。  我是否可以使用另一个工具来共享它?  在此期间、以下是段输出:

    Fullscreen
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    ******************************************************************************
    TMS320C2000 Linker Unix v21.6.0
    ******************************************************************************
    >> Linked Wed Jun 8 15:20:56 2022
    OUTPUT FILE NAME: <tahoe_500-0120_rev002_RAM.out>
    ENTRY POINT SYMBOL: "_c_int00" address: 00013c25
    MEMORY CONFIGURATION
    name origin length used unused attr fill
    ---------------------- -------- --------- -------- -------- ---- --------
    PAGE 0:
    RAMLS3 00009800 00000800 000005ca 00000236 RWIX
    RAMLS4 0000a000 00000800 000000bc 00000744 RWIX
    RAMLS5 0000a800 00000800 00000000 00000800 RWIX
    RAMD0_1 0000b000 00001000 00000e1f 000001e1 RWIX
    RAMGS1_3 0000d000 00003000 00003000 00000000 RWIX
    RAMGS4_7 00010000 00003ff8 00003ff8 00000000 RWIX
    FLASHJ 000b0000 00008000 00001712 000068ee RWIX
    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、我将在今天晚些时候接近硬件时获取 SP。

    感谢你的帮助。  这个问题让我感到困惑:)  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Colin、

    我将通过 E2E 向您发送朋友请求、这在附件方面有更多的弹性。  您很快就会收到一条消息。

    最棒的

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Colin、

    在链接器命令文件中、如果您将内容映射到闪存和 RAM 存储器、请注意、不保证加载 RAM 内容。

    闪存插件专为完全嵌入式闪存应用而开发。  这意味着、链接器命令文件中所有已初始化的段都应映射到闪存。  如果需要从 RAM 执行任何操作、则在运行时应使用 memcpy()将该内容复制到 RAM 中、然后再执行该内容。  

    请参阅以下常见问题解答、了解有关此问题的更多信息:

    [常见问题解答]闪存-如何将应用程序从 RAM 配置修改为闪存配置?: https://e2e.ti.com/support/microcontrollers/c2000/f/171/t/878674 

    谢谢、此致、
    Vamsi

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Colin、

    我即将回复与 Vamsi 类似的内容、尽管我没有他提供的背景(感谢 Vamsi)。 为了扩展 Vamsi 所说的内容、闪存插件本身使用一些 RAM 来对闪存进行编程、可能会对应在 RAM 中的代码进行重新编号、因为首先加载的代码。

    也就是说、如果我将闪存工具设置为仅加载到 RAM (工具->片上闪存)、我就能够使 RAM 映像正确。  因此、在这种情况下、您也许可以正常加载一次(这将对闪存进行编程)、方法是在下图中选择 Erase/Program (擦除/编程)、然后进入闪存工具并仅选择 RAM。  然后再次加载.out、RAM 将被正确加载。  闪存仍将具有其首次加载时的内容。

    正如 Vamsi 提到的、闪存工具更适用于最终映像、您可以在闪存中存储所有内容、并在稍后将其复制到 RAM 中、等等。 但我认为以上内容将有助于您的调试阶段。

    最棒的
    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢

    您的解释很有意义、我很感激周围的工作。

    为了提供上下文、我们的.text 代码大小已发展到无法将所有内容放入所需 RAM 的程度。  和 RAM 构建可显著缩短开发周期。  因此、我尝试将一些基于库的代码写入闪存扇区(基本上是 ROM 库)、以便我们可以继续使用可用的 RAM 来处理我们正在积极开发的代码。

    我对 ROM 库的处理方式将会非常脆弱。  (本质上、调用在链接器文件中未更改的 RTS、nanopb 等的扇区、并将它们放入闪存中)。 但是、由于我有专家在打电话、您能给我一些有关如何创建一个真正的 ROM 库的文档吗?我可以在不同的版本之间可靠地链接该库?  我想我想仿真 F2837xRevB_c1bootROM_CLADataROMSymbols_eabi_fpu32.lib 如何提供闪存中提供的符号的地址。

    谢谢、

    -科林

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    忽略 ROM 库问题。  我找到 了 www.ti.com/.../spraan5.pdf