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.

[参考译文] PHY-AM243X:如果 MCU-PLUS-SDK 模式启用、优化的 memcpy (链接器标志--use_memcpy=fast)在闪存存储器空间0x60000000上失败

Guru**** 1839620 points
Other Parts Discussed in Thread: LP-AM243, SYSCONFIG
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1381027/mcu-plus-sdk-am243x-optimized-memcpy-linker-flag---use_memcpy-fast-fails-on-flash-memory-space-0x60000000-if-phy-mode-enabled

器件型号:MCU-PLUS-SDK AM243X
主题中讨论的其他器件:LP-AM243SysConfig

工具与软件:

您好!

目前我面临的问题是、 如果启用了 PHY 模式和 memcpy 优化(--use_memcpy=fast)、则通过 octo (四路) SPI 访问 LP-AM243板上的闪存失败(一些字节被错误读取为0x00)。

重现步骤:

  • 使用最新 SDK "mcu_plus_sdk_am243x_09_02_01_05"和最新编译器"ti-cgt-armllvm_3.2.Strs"。
  • 导入示例"ospi_flash_io_am243x-lp_r5fss0-0_nortos_ti-arm-clang"。  
  •  在工程设置中设置链接器标志--use_memcpy=fast。  "Project"->"Properties"->"Build"->"Arm Linker"->"Advanced Options"->"Linker Optimization"。 为 --use_memcpy 选择 fast。
  • 然后、通过执行以下步骤之一调整示例项目:
    • 在用于闪存/OSPI 的 SYSCFG 工具中禁用 DMA 支持;
    • 或将 ospi_flash_io.c 中的 APP_OSPI_DATA_SIZE 宏更改为512 (小于1024的单位)。
    • 需要上述两个步骤中的一个、以便 闪存 API 的 Flash_READ ()函数最终将使用 memcpy ()、否则(对于大于1024字节的复制操作)将使用 DMA、DMA 正常运行。
  • 编译示例(我使用了调试构建)并将其与芯片上的调试器加载到芯片上、或将其刷写、无关紧要。
  • 该示例将失败、显示"error:ospi_flash_io_compare_buffers:153:OSPI read data mismatch!!"

下面的屏幕截图说明了出现的问题:

我们只是跳过了 memcpy 指令。 pSrc (闪存内的地址;闪存映射至0x60000000)应复制到 pDst。 我们在右上角看到  pSrc[7]=7、但 pDst[7]=0 (我选择仅显示前10个值、因此一切都可以放入一个屏幕、之后也会出现错误)。 因此、优化后的 memcpy 与闪存地址和启用闪存的 PHY 模式组合似乎存在问题。 如果禁用 PHY 模式、也会正常工作。

最初我偶然发现了这一点,因为 EtherCAT Beckhoff 示例  默认设置了--use_memcpy=fast 标志。 它也默认禁用了 PHY 模式,但如果你启用它(和正确的时钟频率设置,否则 Flash_open()将会失败),闪存读取开始失败。

希望我提供了足够的信息。 如果有任何不清楚的地方、可以随时提问。 感谢你的帮助。

此致、

Martin

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

    尊敬的 Martin:

    感谢您的问题以及重现故障的步骤。

    同时、我在末尾要重新创建、我希望您向我发送 SysConfig 的 MPU ARM 配置、否则整个 SysConfig 文件也会更好。

    此致、

    Vaibhav

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

    尊敬的 Martin:

    我能够重现此问题。

    请参阅随附的屏幕截图和用黄色突出显示的点、标记为错误的读取值0。

    请允许我有时对此进行调查并找出根本原因。

    感谢您的耐心。


    最新动态:

    我看到闪存写入完全没问题、因为0x60200000显示正确的值。 因此只需要调查读取操作。

    此致、

    Vaibhav

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

    尊敬的 Vaibhav:

    很抱歉我迟到了答复。 我在这周的头两天就离开了办公室。

    非常感谢、你们很快就开始调查这一点。 请告诉我,如果我能以任何方式帮助你。

    此致、

    Martin

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

    尊敬的 Martin:

    我对 memcpy()没有什么评论。

    memcpy ()等 C 库内存访问函数始终采用标准内存、不能与特殊的器件/外设内存访问一起使用、因为未对齐访问可能导致故障。

    使用--use_memcpy=small 确实会导致 memcpy 的缓慢版本。 速度较慢的快的低字节进行逐字节复制并正常工作。 但我建议您改用自定义的 memcpy 变体、而不是依赖编译器版本的 memcpy 实现。 您可以使用6/7/8字节 memcopy 进行实验。

    我还要求您访问: https://software-dl.ti.com/codegen/docs/tiarmclang/rel3_2_0_LTS/compiler_manual/using_compiler/compiler_options/runtime_model_options.html#cmdoption-munaligned-access

    最初我偶然发现了这一点、因为 EtherCAT Beckhoff 示例  默认设置了--use_memcpy=fast 标志。 它还默认禁用了 PHY 模式、但如果随后启用它(且正确的时钟频率设置、否则 Flash_open()将失败)、则闪存读取开始失败。[/QUOT]

    我希望您纠正我对这个问题的理解。 您要说 EtherCAT Beckhoff 示例默认将 memcpy 设置为 fast、将 phy 设置为禁用状态。 那么、如果您启用 phy、那么闪存读取就会开始失败?

    期待您的答复。

    此致、

    Vaibhav

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

    尊敬的  Vaibhav:

    感谢您的评论。

    是的、 EtherCAT Beckhoff 示例默认将 memcpy 设置为 fast、将 phy 设置为禁用状态。 所以、如果您启用 PHY、闪存读取将失败。  

    目前我刚刚禁用了-- use_memcpy 选项,我基本上可以这样做。 我创建该线程的主要动机是向 TI 开发团队提示 SDK 的闪存 IO 驱动程序中存在一个错误。 因为这不是我,谁决定使用 memcpy ()非标准内存区域. SDK 函数 OSPI_readDirect ()在闪存区域使用 memcpy ()。

    此致、

    Martin

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

    尊敬的 Martin:

    感谢您的答复。

    目前我刚刚禁用了--use_memcpy 选项、我基本上可以处理这个问题。 我创建该线程的主要动机是向 TI 开发团队提示 SDK 的闪存 IO 驱动程序中存在一个错误。 [报价]

    我已经将您的信息传达给软件开发团队。

    我已针对 上述问题创建了 JIRA、并确保根据进度向您进行更新。

    此致、

    Vaibhav

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

    谢谢你。

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

    Martin、您好!

    我一直打开该主题、以便为您提供状态更新。 目前、创建的 JIRA 无法进入 MCU PLUS SDK 10.0版本、因为已发生代码冻结、SDK 将于2024年8月中旬面市。

    在10.0之后,它将被广泛接受到发行版中。

    此致、

    Vaibhav