我正在阅读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吗?如果是,他们如何使用它?
答案 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实际工作方式的任何文档都要好得多。