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.

[参考译文] TMS570LC4357:TMS570LC4357

Guru**** 2651515 points

Other Parts Discussed in Thread: HALCOGEN, TMS570LC4357

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1572205/tms570lc4357-tms570lc4357

器件型号:TMS570LC4357
主题中讨论的其他器件:HALCOGEN

工具/软件:

大家好!

我请参阅论坛条目 TMS570LC4357:在 RAM 中运行代码时数据中止 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛 、在此论坛中、这个问题已经讨论过但很遗憾未解决。

 

我还遇到了一个问题、即当将过多的代码移动到 RAM 时、经过查看周期后会发生异常。 进行了以下设置:

HalCoGen:

RAM 已为执行代码做好准备。

函数 Scheduler_L4 从软件中断启动、并位于 RAM 区域中。

这是该函数中表示未定义操作码的第一条指令。 在执行组装步骤时、跳转至地址 0x00000004、但未定义合理内容。 然后发生 UNDEF 异常。

 

我从闪存复制到 RAM 的函数大小为 0x57ac。

不违反 RAM 区域。 0x806d4e0 + 0x57ac = 0x8072C8C、这是 MPU 区域 3 内的有效地址。

仅复制 0x3504 字节代码时、一切都正常运行。

然后,函数 Scheduler_L4() 的第一条指令如下所示:

 

因此、指令从 0xE92D4010 更改为 0x F 92D4010.

更多信息:在软件中断 ISR 中启用缓存、并调用复制到 RAM 中的完整代码。

 

您…帮助我、为什么复制到 RAM 的代码大小与其中一个函数中更改的指令之间存在这种明显的相关性

所有设置(HALCOGEN,链接器文件)保持不变、只是更改了代码大小。

 

谢谢、

 

基督教

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

    尊敬的 Christian:
    对延迟的回复表示歉意!

    因此、指令从 0xE92D4010 更改为 0x F 92D4010.

    是否可以验证闪存中的相同指令? 我的意思是我想知道它是在复制到 RAM 过程中损坏还是只是在闪存本身中损坏?

    还要禁用缓存并查看  0x57ac 的行为? 行为有任何变化?

    我们还有一个内部人工智能,它将分析我们所有的旧线程,并提供建议,下面是一些建议从你的线程:

    从 RAM 执行代码并在 TMS570LC4357 上启用缓存时、您遇到的问题似乎与几个潜在因素有关。 我的分析如下:

    1. 内存损坏问题:
    • 您看到的指令损坏 (0xE92D4010 变为 0xF92D4010) 表明在代码复制过程中可能存在高速缓存/存储器同步问题或存储器损坏。
    • 它适用于较小的代码大小(0x3504 字节)、但在较大的代码大小(0x57ac 字节)下失败、这表明可能存在边界或对齐问题。
    1. MPU 配置:
    • 虽然您的 MPU 区域 3 设置对于地址范围显示为正确、但可能会存在重叠的 MPU 区域、从而影响执行 (4)。
    • 当 MPU 区域重叠时、编号较高区域的属性优先 (4)。
    1. 高速缓存注意事项:
    • 由于您提到已启用缓存、因此在将代码复制到 RAM 并执行代码时可能会出现缓存一致性问题。
    • 将代码复制到 RAM 后和执行之前、可能需要正确使缓存失效。

    建议:

    1. 高速缓存管理:

      • 将代码复制到 RAM 后、确保缓存正确失效
      • 考虑在代码复制之后添加高速缓存同步障碍
      • 您可能需要刷新并使指令和数据缓存无效
    2. 内存对齐:

      • 确保为代码执行正确对齐 RAM 目标地址
      • 验证复制操作在整个过程中是否保持正确对齐
    3. MPU 配置:

      • 仔细检查可能与 RAM 执行区域重叠的所有 MPU 区域设置
      • 确保 RAM 区域具有正确的执行权限和缓存属性集
    4. 代码大小权变措施:

      • 它适用于较小的代码大小、因此如果可能、请考虑将功能拆分为较小的块
      • 处理较大的代码段时、可能需要添加额外的缓存管理操作

    --
    此致、
    Jagadish。

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

    尊敬的 Jagadish:

     

    感谢您的时间和回答!

     

    是否可以在闪存中验证相同的指令? 我的意思是我想知道它是在复制到 RAM 过程中损坏还是只是在闪存本身中损坏?

    这是 RAM 中第一个错误指令 0xF92D4010 的函数

     

    以下是闪存中的函数:

     

    功能完全相同。 因此、错误没有在运行时发生、而是在编译/链接期间发生?

    并禁用缓存并查看  0x57ac 的行为? 行为有任何变化?

    禁用高速缓存时、此函数似乎正确:

    第一条指令不再未定义、但以某种方式从 0xE92D4010 更改为 0xE82D4010。

     

    但我找到了另一个函数、该函数从闪存复制到 RAM、其中一个指令未定义:

    此指令在闪存中也是错误的。

    我认为禁用缓存不会改变此问题。

     

    主要问题是、为什么闪存中也有错误?

     

    再次感谢您的帮助

     

    基督教

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

    尊敬的 Christian:

    对延迟的回复表示歉意:

    在 RAM 中执行代码时遇到的问题似乎与以下几个因素有关:

    1. 高速缓存和内存配置:
    • 您已启用缓存并从 RAM 执行代码
    • 指令损坏 (0xE92D4010 变为 0xF92D4010) 表明潜在的缓存一致性或存储器访问问题
    1. 大小相关性:
    • 该代码适用于较小的大小(0x3504 字节)、但在较大的大小(0x57ac 字节)下失败
    • 存储器范围 (0x806d4e0 至 0x8072C8C) 在 MPU 区域 3 内

    以下是可能的原因和建议:

    1. MPU 配置:
    • 确保执行代码的 RAM 区域具有正确的 MPU 属性:
      • 必须启用执行权限
      • 必须设置正确的缓存属性
    • 当存储器区域重叠时、编号最大的区域优先
    1. 高速缓存管理:
    • 从 RAM 执行代码之前、请确保进行正确的缓存管理:
      • 对复制代码的 RAM 区域的数据缓存进行清理并使其无效
      • 将代码复制到 RAM 后使指令缓存失效
      • 请考虑在复制代码后设置内存障碍
    1. 内存属性:
    • 对于执行代码的 RAM 区域、请考虑使用:
      • NORMAL_OIWTNOWA_SHARE(直写)、而不是回写缓存策略
      • 或 NORMAL_OINC_SHare(不可缓存)以实现更确定的行为

    验证 RAM 区域的 MPU 设置:

    // RAM 执行的 MPU 配置示例
    MPU_Region[3].BaseAddress = 0x806d4e0;
    MPU_Region[3].size = MPU_SIZE_32KB | MPU_REGION_ENABLE;
    MPU_Region[3].Attributes = MPU_PRIV_RW_USER_RW_EXEC | MPU_NORMAL_OIWTNOWA_SHARE;

    添加缓存管理操作:

    //将代码复制到 RAM 后
    cleanDCache();//清理数据缓存
    invalidateICache();//使指令缓存无效
    dataMemoryBarrie();//确保所有内存操作均已完成
    instructionSynchronizationBarrier();// Synchronize contex

    如果较大的代码量仍然存在问题、请考虑:

    • 将代码拆分成更小的部分
    • 对执行区域使用不可缓存的存储器属性
    • 在段之间实现额外的存储器障碍

    --
    此致、
    Jagadish。