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.

[参考译文] TMS570LS0432:printf()语句的内存映射问题

Guru**** 2540430 points
Other Parts Discussed in Thread: HALCOGEN, TMS570LS0432, LAUNCHXL2-570LC43

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1011194/tms570ls0432-memory-mapping-issue-with-printf-statements

器件型号:TMS570LS0432
主题中讨论的其他器件:HALCOGENLAUNCHXL2-570LC43

我的主要症状是在 CCS 控制台中、任何 printf 语句都会导致以下响应:

"无效的 CIO 命令(0)。  存储器映射阻止读取0x0800970C"

该存储器位置与 CIOBUF 段相对应、我认为该段是 printf 使用的临时数据、调试器会读取这些数据以显示 printf 语句。 (请参阅下面的)

在我的调试工作中、我注意到、只要这个 CIOBUF 部分的电压高于0x0800_8000、这个问题就会出现取决于 HalCoGen 配置的用户堆栈大小和二进制大小。 我的理论是、这可能是调试器上的配置设置(也许是 GEL 文件?) 而不是处理器/HAL 代码。

其他

  • 禁用 MPU 任何不同的 nMPU 区域都不会影响该问题
  • 根据应用程序二进制文件、这个问题间歇性出现(也许较小的堆栈分配会使 CIOBUF 符号更有可能下降到0x0800_8000以下)
  • 没有与观察到的0x0800_8000边界相对应的 HalCoGen MPU 或 RAM 设置。
  • 我在 CCS 之外构建我的二进制文件、但使用 CCS 来刷写二进制文件并使用调试器-在 CCS 使用的编译步骤和调试器配置之间、可能会丢失一个设置?

如果这是一个调试器、在参数或文件上设置任何要研究的指令将会很有帮助。 谢谢!

我的 hL_sys_link.cmd 文件:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="484598" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1011194/tms570ls0432-memory-mapping-issue-with-printf-statements 在调试过程中、我注意到、根据 HalCoGen 配置的用户堆栈大小和二进制大小、每当此 CIOBUF 段的值超过0x0800_8000时、都会出现此问题。

     TMS570LS0432具有32KB RAM、介于 0x08000000和 0x08007FFF 之间、如数据表所示:

     ccs1030/CCS_base/emulation/gel/tms570ls043x.gel 与上述内容相匹配、这说明了 CCS 调试器为什么报告 "无效的 CIO 命令(0)。 内存映射阻止读取0x0800970C":

            GEL_MapAdd(0x08000000, 0, 0x00008000, 1, 1); /* Internal RAM          */

    [引用 userid="484598" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1011194/tms570ls0432-memory-mapping-issue-with-printf-statements "]

    我的 hL_sys_link.cmd 文件:

    [/报价]

    是什么导致 HL_SYS_LINK_cmd 将 RAM 存储器区域设置为从0x08004000到0x0807EFFF、该区域超出 TMS570LS0432中32KB RAM 的末尾?

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

    切斯特-感谢您对此进行研究。

    我相信这个用于 Hercules Launchpad 的芯片组与 SPNU563A 相对应、后者的 RAM 大于您所显示的配置(2018年3月版):

    https://www.ti.com/lit/ug/spnu563a/spnu563a.pdf?ts=1624119072343&ref_url=https%253A%252F%252Fwww.google.com%252F

    为了实现这一目标、我使用了由 New > TMS570LC43x > TMS570LC43572WT 创建的缺省项目、它的 RAM 配置显示为:

    存储器

    /*用户代码开始(2)*/
    /*用户代码结束*/
    引导程序(X):origin=0x00000000 length=0x00000020
    FLASH0 (RX):origin=0x00000020 length=0x001FFFE0
    FLASH1 (RX):origin=0x00200000 length=0x00200000
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0007eb00

    /*用户代码开始(3)*/
    /*用户代码结束*/

    我认为这与数据表相匹配。 也许它就像更新 GEL 文件并将其加载到 CCS 一样简单?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="484598" URL"~/support/microcontrollers/other-microcontrollers-group/other/f/other-microcontrollers-forum/1011194/tms570ls0432-memory-mapping-issue-with-printf-statements/3736920 #3736920"]我认为该 Hercules Launchpad 芯片组对应的 SPNU563A、该芯片组的 RAM 大于您显示的配置(2018年3月版本):

    您能否说明您使用的是哪款 Hercules Launchpad?

    该线程标题包含 TMS570LS0432、这是我列出的 RAM 的器件数据表。

    而 SPNU563A 用于 TMS570LC43x。

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

    PN 是 LAUNCHXL2-570LC43、我认为它对应 于 TMS570LC43x。

    这种混淆实际上是我问题的根本原因-我使用"TMS570LS043x" CCS 配置而不是正确的"TMS570LC43x"、它们必须足够接近以刷写 ELF、但由于 RAM 大小而出现间歇性问题。

    我的问题现已解决、请随意重新解决您认为合适的问题。 感谢您的支持!