具有Cortex M3和M4的LDREX / STREX

时间:2018-06-26 12:55:20

标签: arm

我正在阅读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吗?如果是,他们如何使用它?

1 个答案:

答案 0 :(得分:4)

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

LDREX地址1

LDREX地址2

STREX地址1

即使最后一个LDREX不是地址1的地址,STREX也会通过。这是正确的,因为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实际工作方式的任何文档都要好得多。