我正在阅读LDREX和STREX以实现互斥。通过查看ARM参考手册:

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.100166_0001_00_en/ric1417175928887.html

看起来LDREX / STREX仅存储地址粒度是整个内存空间,因此仅允许在最多一个32位寄存器上使用LDREX / STREX。

这是正确的还是我错过了什么?如果是这样,则会使LDREX / STREX非常有限。我的意思是您可以做一些映射的互斥锁,也许可以得到32个互斥锁。

是否有人在M3或M4上使用LDREX / STREX?如果是,他们如何使用它?

最佳答案

因此,我联系了ARM并获得了更多信息。例如,如果您这样做,则LDREX / STREX将失败:

LDREX地址1

LDREX地址2

STREX地址1

即使最后一个LDREX不是地址1的STREX到地址1也将通过。这是正确的,因为LDREX / STREX地址解析是整个存储空间。

所以我担心如果您有两个任务:第一个任务在第一个LDREX之后被中断,然后第二个任务在第二个LDREX到达address2之后被中断,然后第一个任务让处理器返回并尝试STREX,它将引起问题。但是,ARM似乎在每个异常/中断进入和退出时都发出CLREX。因此STREX将失败,因为必须通过中断来抢占任务。也就是说,如果LDREX和STREX之间发生任何中断,则STREX将失败。因此,您希望在LDREX和STREX之间保持尽可能小的代码,以减少中断的机会。此外,如果STREX失败,您很可能希望在放弃之前再尝试一次或两次LDREX / STREX过程。

同样,这是针对单核M3 / M4 / M7。

请注意,在《 ArmV7-M体系结构参考手册》第A3.4.4节“上下文切换支持”中,我发现唯一清除了CLREX引用的地方。该文档比我在网上找到的描述LDREX / STREX实际工作方式的任何文档都要好得多。

08-19 23:03