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.

[参考译文] MCU-PLUS-SDK-AM243X:来自 ICSSG0 RAM 的 R5F memcpy 出现数据中止异常

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1119448/mcu-plus-sdk-am243x-data-abort-exception-with-r5f-memcpy-from-icssg0-ram

器件型号:MCU-PLUS-SDK-AM243X

您好!

在 R5F 内核上使用大小为4的 memcpy 时、来自 ICSSG0 RAM 字节地址、我获得了数据中止异常。

请参阅以下代码片段:

void* pvTest = (void*) 0x30010002;
uint8_t au8Array[8];
memcpy(au8Array, ((uint8_t*) pvTest), 4);

在汇编器中、它作为 LDR 实现。

 > memcpy(au8Array, ((uint8_t*) pvTest), 4);
E59D0024            ldr        r0, [r13, #0x24]
E5900000            ldr        r0, [r0]
E58D001C            str        r0, [r13, #0x1c]

此代码可用于其他存储器区域(MSRAM、DDR4)、但不适用于 ICSSG0或 ICSSG1 RAM。

您对此问题是否有任何解决方案?

此致、

Sven

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

    Sven、您好!

    您还可以共享此区域的 MPU 设置吗?

    谢谢、

    Aakash

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

    Aakash、您好!

    我们没有该存储器区域的 MPU 区域。 我们使用 MPU 区域对其进行了测试、但没有任何差异。 您是否有任何我们可以测试的通信?

    Sven

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

    您好!

    访问 GPMC SRAM 时也会出现此问题。

    在我看来、问题是当复制数据的大小固定为2或4时、ti 编译器的 memcpy 的优化。 生成的 LDR/ldr 汇编器代码对于每个外设存储器控制器无效、这会导致数据中止异常。

    当副本大小未固定时,代码将分支到 正确处理这些访问的__aeabi_memcpy()。

    建议:是否可以在编译器中实现此优化并分支到 __aeabi_memcpy?

    此致、Sven

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

    你好 Sven!

    当涉及具有特殊访问要求的存储器或存储器映射外设寄存器(及类似)时,memcpy()的使用被视为无效。  编译器的 memcpy()实现不能保证它将如何访问副本的内存,包括在优化中内联固定长度的副本,就像您在这里所做的那样。  此外,您访问此内存的指针可能会被标记为'volatil',然后编译器会告诉您它与 memcpy()的使用不兼容。

    对于此用例、应使用您自己的复制函数并使用'volatil'来确保编译器执行您希望的操作。

    希望这对您有所帮助!

    -Alan

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

    因此、我们使用外部 SRAM 作为执行、放置用于代码执行和数据访问的内存、这是不可选项的。 据我所知、__aeabi_memcpy 通过将副本分割为单独的较小副本单元来避免未对齐的内存访问。 这不是高性能的、而是避免数据中止。

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

    从您的同事那里、我得到了使用 -mno-unaligned 访问作为编译器标志的提示。 它可以作为大小固定为 n 的 memcpy 正常工作、是作为 n ldrb 汇编器命令实现的。