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.

[参考译文] AM5728:InterCore SpinLock DSP 和 ARM 内核通信访问共享存储器

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1530181/am5728-intercore-spinlock-dsp-and-arm-core-communication-access-the-share-memory

器件型号:AM5728

工具/软件:

你(们)好
定制板:基于 TI Sitara AM5728。

操作系统 — VxWorks7 2503.

我已将 VxWorks7 从 VxWorks 2107 升级到 2503。
为了访问这些内核之间的共享内存资源,我使用了 spinlock 机制,我们称之为 interCore spinlock。
以前、此旋锁可在 VxWorks7 2107 上正常工作、但升级后无法访问共享内存资源。 寄存器配置和代码与我用于 2107 的相同。
这是什么东西缺失?

用于锁定 IM、使用此 HW_RD_FIELD32 API 和解锁 HW_WR_FIELD32。 为此、我传递旋转锁定地址。
基本上是在 ARM 内核上设置锁、但无法解锁。
while (status!= 0)

STATUS = SPINLOCKLockStatusSet (spinLockBaseaddr、LOCK);//这将设置 HW_RD_FIELD32
//在这里无限等待
}
您能帮帮我们吗?
谢谢。

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

    您好 Hanmant、

    很遗憾、此论坛不支持 VxWorks。 您可以尝试直接联系 WindRiver 获取支持: https://support2.windriver.com/

    我对软件栈一无所知、但 Google AI 给出了一些优点、这些优点是在 VxWorks 中使用旋锁的一般最佳做法-

    “如果 VxWorks 中的旋锁未解锁,则通常表示您的实时系统中的并发和同步存在问题。 以下是可能发生这种情况的一些常见原因:  
    1、因错误的优先级管理而死锁:
    • 高优先级任务在由低优先级任务保持的锁上旋转: 这是导致实时系统死锁的典型原因。 不能计划保持锁定的较低优先级任务运行和释放锁定、因为较高优先级的任务正在忙于旋转、需要占用 CPU 周期。 这可以防止较低优先级的任务有机会释放锁定、从而导致两个任务都卡住的死锁。
    • 建议: 如果使用自旋锁、请确保可能在同一锁上旋转的所有线程或任务具有相同的优先级。  
    2.长时间按住自旋锁:
    • SPINLOCK 专为非常短的关键部分而设计: 如果任务拥有 SPINLOCK 的时间过长,它会浪费 CPU 周期,因为其他任务被强制旋转并等待。 这会导致性能下降甚至死锁、尤其是在许多内核争用同一锁的系统中。
    • 建议: 尽可能缩短使用旋锁保护的临界区。 对于较长的关键部分、请考虑使用互斥体、这些互斥体会使等待任务进入睡眠状态、而不是让它们旋转。  
    3.按住自旋锁的同时执行阻塞操作:
    • 切勿调用在按住 spinlock 时可能阻塞或休眠的函数: 这包括 I/O 等操作(例如) printf或任务生成。 如果一个任务包含 spinlock 块、则等待锁定的其他任务将继续无限期旋转。
    • 建议:  在 获取旋锁之前分配任何必要的资源、仅在释放锁后执行阻塞操作。  
    4、自旋锁变体的错误用法:
    • 对上下文使用错误的 spinlock 变体: 像 Linux 一样的 VxWorks 为各种上下文(例如,中断处理程序)提供不同的 spinlock 变体。 使用错误的变体可能会导致意外行为和死锁。
    • 建议: 根据是否需要在保持锁定时禁用中断、仔细选择合适的 spinlock 变体。  
    5、嵌套锁,有任意顺序:
    • 以不一致的顺序获取多个锁: 如果任务或线程获取嵌套锁(例如,一个任务中的 spinlock A、spinlock B、另一个任务中的 spinlock A ),则可能导致死锁。
    • 建议: 始终建立清晰的锁定层次结构、并确保所有任务都按照相同的预定义顺序获取锁定。  
    6、系统因锁的卫生状况不佳而挂起:
    • 与锁使用相关的一般不良做法: 如锁的保持时间超过必要时间、在需要时未保持锁、或未正确使用锁等问题可能导致系统挂起、尤其是在使用嵌套锁时。
    • 建议: 遵循使用锁的最佳实践、仔细检查代码以避免潜在问题。  
    从本质上讲,如果 VxWorks 中的旋锁没有被解锁,这可能是一个与系统并发模型中的旋锁使用方式相关的更深层次问题的症状。  专注于确保正确的优先级管理、尽量缩短关键部分的持续时间、并避免在按住旋锁时执行阻塞操作。  “
    -Josue