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.
您好、TI 专家、
我正在用户共享存储器区域(地址0x701D0000)中使用一个全局变量、该变量由多个内核位屏蔽。
有时在无引导模式下运行时、我观察到地址 0x701D0000处的变量会被不同内核而不是位屏蔽覆盖。 特别是、当我将应用软件刷写到 QSPI 闪存中时、应用软件不会启动、因为我认为执行会卡住、检查位屏蔽变量是否为指定值。
您能告诉我如何解决此问题吗? 是否有 MPU 设置可以阻止对其他内核进行存储器覆盖? RAM/缓存或引导加载程序中需要进行哪些更改?
提前感谢!
您好、 Sue A、
此信息不足以支持这一点。 您是否看到与 IPC Notify 示例相同的行为、或者您是否更愿意通过自内核的 MPU 设置阻止对此区域的访问、以消除此行为不负责任的相同内核?
此致、
Aakash
尊敬的 Aakash:
我无法使用 IPC NOTIFY 示例、因为系统工程配置为 AM2631而不是 AM2634。 您能告诉我您在此情况下还需要哪些其他详细信息来帮助您吗?
此外、如何通过自内核的 MPU 设置阻止对特定区域的访问?
谢谢!
您好、 Sue A、
您需要在 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、并确定它在何处进入数据 中止?
此致、
阿什温