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.

[FAQ] [参考译文] [常见问题解答] AM2732:将代码放置在 L3存储器区域(0x8000_0000)中会触发应用程序中的预取中止异常。

Guru**** 2462060 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1480552/faq-am2732-placing-code-in-the-l3-memory-region-0x8000_0000-triggers-a-prefetch-abort-exception-in-the-application

器件型号:AM2732
主题中讨论的其他器件:SysConfig

工具与软件:

如果没有应用程序在到达 main ()之前失败,并且抛出 prefetch_abort 错误,我就不能将代码放在 L3中 ,如何解决这个问题?

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

    问题:

    尝试使用 SysConfig 或 R5文档中标记为"从不执行"的链接器命令文件在存储器位置设置.text 区域将导致内核在应用程序到达 main ()函数之前达到 Hwip_prefetch_abort_handler()。 例如、尝试将.text 放置在存储器区域0x8000_0000会导致如下错误:

    预取中止是由内核尝试从受限存储器区域的入口点提取第一条指令引起的、但此时该区域仍无法在应用程序中初始化、从而导致应用程序处于预取处理程序中、因为它无法到达主函数。 即使在 SysConfig 中将0x8000_0000空间标记为可执行空间、这也不足以将该区域启用为  MPU 配置发生在_c_int00入口点、而不是发生在 SysConfig 或 SBL 应用程序调用的驱动程序中;  尝试在引导加载程序时间设置 MPU 也会失败、因为引导加载程序会在执行结束时复位器件、并将 MPU 配置恢复为默认值。

    解决方案:

      

    应用程序将继续到达预取中止处理程序、除非在应用程序到达其主函数之前成功配置 MPU。 要执行此操作、请单击.text。 在 MPU 启用中扮演部分的段必须移动到可执行位置(默认情况下未定义为"从不执行"的任何区域)、以便它们启用 MPU、然后允许器件到达 main。  

    内核会从 ARM 的初始引导、MPU、HwIP 和 Cache 例程中获取指令。 如果任何必要的函数位于不可执行区域中、则会使内核位于预取中止处理程序中。 中定义了这些函数  .text。 偏移漂移  (查看上面的屏幕截图) 、这些内容默认不是在 SysConfig 中 定义的 、但我们可以轻松定义它们、以便将必要的功能放置在可访问的区域中。 以下是有关将这些初始化区域移动到内核中的可执行区域、同时仍将主代码保持在受限区域的说明:

    1.在 R50-0和/或 R50-1应用程序中、打开 SysConfig 并转至"Memory Configurator (内存配置器)"、然后单击"SECTIONS (部分)"。 您将看到以下内容:  

    2.选择具有执行权限的存储器位置、以便放置 MPU 初始化函数。 必须在 SysConfig 的"Memory Configurator (内存配置器)"部分下将该位置定义为"Memory Region"

    3.在上一步中定义的区域中创建新的输出段。 他们总共有4人:

    这些输出段的名称必须与上面的屏幕截图中完全相同;这不是可选的、因为这些是初始化例程中定义的隐式子段的名称  

    4.执行上述操作后、MPU 初始化已经成功被放置在一个可执行区域内、在这个区域内可从进入点提取指令、而同时将剩余的代码和文本保存在 L3内存或者任何其它缺省不可执行区域内