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.

[参考译文] AM2634:MPU 设置

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1290243/am2634-mpu-settings

器件型号:AM2634
主题中讨论的其他器件: AM2631

您好、TI 专家、

我正在用户共享存储器区域(地址0x701D0000)中使用一个全局变量、该变量由多个内核位屏蔽。  
有时在无引导模式下运行时、我观察到地址 0x701D0000处的变量会被不同内核而不是位屏蔽覆盖。 特别是、当我将应用软件刷写到 QSPI 闪存中时、应用软件不会启动、因为我认为执行会卡住、检查位屏蔽变量是否为指定值。

您能告诉我如何解决此问题吗? 是否有 MPU 设置可以阻止对其他内核进行存储器覆盖? RAM/缓存或引导加载程序中需要进行哪些更改?

提前感谢!

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

    您好、 

    此信息不足以支持这一点。 您是否看到与 IPC Notify 示例相同的行为、或者您是否更愿意通过自内核的 MPU 设置阻止对此区域的访问、以消除此行为不负责任的相同内核?

    此致、
    Aakash

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

    尊敬的 Aakash:

    我无法使用 IPC NOTIFY 示例、因为系统工程配置为 AM2631而不是 AM2634。 您能告诉我您在此情况下还需要哪些其他详细信息来帮助您吗?
    此外、如何通过自内核的 MPU 设置阻止对特定区域的访问?

    谢谢!

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

    您好、 

    您需要在 syscfg 中创建一个新的 MPU 区域、并确保设置为  已阻止  都可以使用管理员模式。

    希望这对您有所帮助。

    此致、
    Aakash

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

    尊敬的 Aakash:

    感谢您的答复。
    我发现问题与下面代码中的 IpcNotify_syncall 函数有关。 当我尝试从 QSPI 闪存启动应用时、执行似乎停在 IpcNotify_syncall 中。 您能否告诉我可能导致此问题的原因、以及如何解决?

    当我注释掉 IpcNotify_syncall 函数时、应用程序会正常启动。

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

    您好、Sue A、

    似乎存储器最有可能用于 IPC 通信-

    让我尝试获取有关  IpcNotify_syncall 与该存储器的关系的更多信息。

    此致、
    Aakash

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

    谢谢 Aakash。 我将等待您的回答。
    仅供参考、变量 SyncAllCores 的地址为0x701D0000。

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

    您好、Sue、

    地址0x701D0000不用于 IPC。 IPC 使用从0x72000000开始的邮箱存储器。

    IPC Sync All 用于在应用程序中的所有内核之间同步。 需要为系统中的每个内核正确配置 IPC 的 SYSCFG 模块。  

    您正在使用多少个内核? 此外、您能否发布每个内核中 IPC 的 SYSCFG 模块配置的屏幕截图?

    此致、

    阿什温

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

    尊敬的 Ashwin:

    感谢您的答复。
    我使用3个内核。 内核0、内核2和内核3。  
    内核0和内核1设置为锁定步进、内核2和内核3处于双核模式。

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

    尊敬的 Ashwin:

    如果您有任何更新、请告诉我。

    谢谢!

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

    您好、Sue、

    配置看起来没有问题。 您是否可以在 IPC Notify ISR IpcNotify_ISR()中添加断点,看看调用 IpcNotify_syncall 后是否调用了断点 ? 当  调用 IpcNotify_syncall 时、内核向每个其他内核发送同步消息、然后等待从所有其他内核接收同步消息。 这有助于同步系统中的每个内核。 我怀疑本例中的 ISR 没有被内核命中。

    此致、

    阿什温

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

    尊敬的 Ashwin:

    当我在无引导模式下从 CCS 调试运行时、
    1)当我刚在"组"内核上运行时(在 IpcNotify_ISR()没有断点),应用程序运行正常。 SyncAllCores 设为0x0D。 因此,我确信 IpcNotify_ISR()按预期被调用给每个内核。
    2)当我在"组"内核上点击 run (在 IpcNotify_ISR()有一个断点)时,内核0和内核2同时点击该断点,在再次运行后,内核3将点击该断点。 但是、SyncAllCores 设置为0x09。 看起来内核2写入的位会以某种方式被覆盖。 您能告诉我为什么会发生这种情况以及如何解决它吗? 仅供参考、FreeRTOS 在 Core 2上运行、并为任务分配动态内存。 其他两个核心是裸机。 我不确定这是否与存储器覆盖相关。

    感谢您的帮助!

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

    ...

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

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

    您好、Sue、

    出现此问题的原因可能是您正在执行的读取、修改、写入操作。 它可能导致竞态条件、因为该操作不是原子操作。 读操作完成后、另一个内核可能会更新存储器、导致当前内核的数据过时。 由于存储器是跨内核的共享资源、因此我们应该使用自旋锁来保护它。

    另一个建议,如果 SyncAllCores 仅用于同步每个内核,它可以替换为 IpcNotify_syncall (),因为它可以执行相同的操作。  IpcNotify_syncall()可以在 GPIO 写入前后调用。

    此致、

    阿什温

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

    尊敬的 Ashwin:

    感谢您的快速响应。
    我添加了 SyncAllCores 注释、并确保两个内核之间不存在共享资源。
    我现在只使用 IpcNotify_syncall ()同步内核。 现在,当我在  IpcNotify_ISR()处应用断点时,行为与我之前在案例2中所描述的类似(当我在"组"内核上运行时(在 IpcNotify_ISR()处有断点),内核0和内核2在再次运行后同时点击断点, 内核3命中断点)。  

    内核0和内核3开始正常运行、但内核2进入无限中止循环。 内核2上的执行不能到达 IpcNotify_syncall()之后的 GPIO 写入。 如果我遗漏了任何内容、请提供建议。








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

    您好、Sue、

    上述代码在没有断点的情况下是否可以正常运行?

    此外、你能否单步执行内核3中的 ISR 并确定它在何处进入数据中止?

    此致、

    阿什温

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

    尊敬的 Ashwin:

    是的、当我在没有断点的情况下从 CCS 无引导模式下运行代码时、代码运行正常。 但是、此代码无法从 QSPI 闪存中启动。

    当我在 CCS 的无引导模式下运行时添加断点时、内核2会进入无限中止循环。 这是代码跟踪。



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

    Sue:

    您能否逐步完成"内核2"中的 IPC Notify ISR、并确定它在何处进入数据 中止?

    此致、

    阿什温