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.

[参考译文] TMS320F2800157:代码加载后 RAM 数据未归零

Guru**** 2535750 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1416283/tms320f2800157-ram-data-not-zeroed-after-code-load

器件型号:TMS320F2800157
Thread 中讨论的其他器件:C2000WARE

工具与软件:

尊敬的专家:

我使用 CCS 调试工具加载程序、在单击"run"按钮之前、我注意到 RAM (LS0和 LS1 RAM)区域包含非零数据。 经进一步调查、我发现这些数据主要是从闪存复制的、因为 RAM 内容与闪存内容大体相同、但不完全相同。 我以前在其他 TI C28x 器件上没有观察到这种现象。

即使使用 TI 演示代码、问题仍然存在。 我已经确认 RAM 数据与 RAM 中运行的函数无关。 例如、虽然在 RAM 中运行的函数占用的范围为0x8000至0x8AAC、但有些数据也会出现在0x9200。

跟踪后、似乎正在从0x8A200处的闪存复制此 RAM 位置的数据。

您能否说明一下、在 F2800157上、是否会将一些闪存数据复制到 RAM 中、从而导致 RAM 在加载程序之后但运行代码之前包含非零数据? (即使在运行代码后、此 RAM 数据也不会恢复为零。) 此行为是不常见的、因为我在其他 C28x 器件上没有遇到它。

作为参考、我使用 F2800157 EVB 进行验证。

谢谢。此致、

C.C.C.Liu

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

    C.C.

    您能否给出您所使用的示例项目、CCS 版本和 C2000Ware 的版本?  

    我同意在我们的示例中、将闪存复制到 RAM 代码需要通过 memcopy 函数调用来处理、这是程序执行的一部分。

    还有一种替代方法可以通过使用 boot init 表将代码从闪存复制到 RAM;但这在项目的.cmd 文件中应该很明显、我看不到这种方法在使用中。 即使这样、器件也必须执行代码、即使不在.main 中也是如此。

    我唯一想说的是、如果存储器内容来自先前运行的内容、或者如果闪存中已经有代码、并且引导引脚配置为引导至闪存、那么作为该代码执行的一部分、memcopy 会发生在您连接到器件之前。

     在 GEL 文件中、有与器件关联的行在连接时执行 mem init、这将把内存归零;如果该 GEL 不存在、则不会自动发生这种情况。

    如果将引导引脚更改为"Wait Boot"、则可以看到此现象是否消失。

    此致!

    Matthew

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

    您好、Matthew:

    CCS 版本: 12.5.
    C2000Ware 版本: C2000Ware_5_01_00_00
    我使用的 TI 演示工程: ..\C2000Ware_5_01_00_00\driverlib\f280015x\examples\flash\flashapi_ex1_programming

    同时、在将引导模式切换到"等待引导"之后、RAM (LSx)仍在填充闪存数据(RAM 数据在加载程序后、但在我开始运行代码之前填充)。

    谢谢。此致、

    c. C、Liu

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

    陈智

    感谢您提供示例文件、让我看看我是否可以在设置中重新创建这个文件。

    此致!

    Matthew

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

    陈智

    我已经复制了行为并进行了解释。  

    当我们加载包含闪存地址的.out 文件时、CCS 闪存插件的方式是、首先复制闪存 API/某些内核以将闪存内容传递到其中进行编程。  这是您在加载程序后、执行代码之前在 L0 SRAM 中看到的内容。

    现在、如果继续通过 memcopy 函数执行代码、您将看到内容与使用 CCS 加载程序后存在的内容不同。

    所以、您在闪存加载程序后看到的内存不会被加载的任何项目使用。

    如果需要在加载程序后、您可以用全0x0000填充 L0/L1 SRAM、并且您将看到工程会像 memcopy 应发生的那样成功执行。

    在其他具有更多 SRAM 的器件上、我们可能将此代码放置在地址较高的 SRAM 中、而该 SRAM 可能尚未使用、因此并不明显。  这里、由于 SRAM 不是很多、程序加载器和项目本身正在重新使用相同的段。

    另外一件可以尝试调试的事情是在代码被编程后、断开连接并重新通电(在等待引导中)、然后手动连接到目标(不要使用调试按钮、这样会再次重新加载闪存和 SRAM)、加载此项目的符号、您应该会看到 SRAM 全部为0x0000、然后项目将再次正常运行。

    此致!

    Matthew

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

    您好、Matthew:

    感谢您的解释。 在测试 F280049C 后、我发现在对代码编程后、闪存数据复制到从0xC0000 (GS0)开始、这一点之前没有影响我针对此芯片的代码、因此我没有观察到这种行为。

    在我自己的 F2800157应用中、我有一些没有初始值的全局变量。 如果闪存数据复制到 LSx、这些未初始化的全局变量可能会分配复制的闪存数据、导致异常的程序行为。

    为了解决此问题、我发现 LSxINIT 寄存器可用于初始化 LSx RAM。 配置该寄存器后、LSx 确实会清零。 我想确认:我可以在主函数开始时配置该寄存器(在任何系统初始化之前)吗?

    谢谢。此致、

    c. C、Liu

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

    C.C.、  

    我最近发表了一篇关于类似的文章。  请看一下该客户在上一篇文章中提到的内容、主要是将 init 插入 code_start_branch.asm 中。  此时执行 init 可确保不会覆盖.cinit 中完成的任何操作。

    https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1416967/tms320f28p650dk-questions-about-gsxram-initialization-after-cpu1-watchdog-reset

    此致!
    Matthew