- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在阅读 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 不是针对 address1 的,到 address1 的 STREX 也会通过。这是正确的,因为 LDREX/STREX 地址解析是整个内存空间。
所以我担心如果你有两个任务:第一个任务在第一个 LDREX 之后被中断,然后第二个任务在第二个 LDREX 到地址 2 之后被中断,然后第一个任务让处理器返回并尝试STREX 会导致问题。但是,ARM 似乎在每次异常/中断进入和退出时都会发出 CLREX。因此,STREX 将失败,因为任务必须通过中断抢占。也就是说,如果 LDREX 和 STREX 之间发生任何中断,则 STREX 将失败。因此,您希望 LDREX 和 STREX 之间的代码尽可能小,以减少中断的机会。此外,如果 STREX 失败,您很可能希望在放弃之前再尝试一次或两次 LDREX/STREX 过程。
这同样适用于单核 M3/M4/M7。
请注意,我发现 CLREX 被清除异常的唯一地方是 ArmV7-M 架构引用手册 A3.4.4 上下文切换支持部分。这份文件比我在网上找到的描述 LDREX/STREX 实际工作原理的任何文件都要好得多。
关于arm - LDREX/STREX 与 Cortex M3 和 M4,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51043489/
在 Intel 上,CMPXCHG 的参数必须与缓存行对齐(因为 Intel 使用 MESI 来实现 CAS)。 在 ARM 上,ldrex 和 strex 在独占保留粒度上运行。 需要明确的是,这是
是否有任何可靠的(最好是没有漏报和漏报)方法来检测 Linux/ARM 运行时 LDREX/STREX 原子操作的可用性?我在辅助 vector 的 AT_HWCAP 字段中寻找了一些东西,发现了一些
以下是 ARM 手册中的自旋锁实现示例。请查看这里:http://infocenter.arm.com/help/topic/com.arm.doc.genc007826/Barrier_Litmus
我正在阅读 LDREX 和 STREX 以实现互斥锁。通过查看 ARM 引用手册: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.do
在 Cortex-M3 指令集中,存在一系列 LDREX/STREX 指令,因此,如果使用 LDREX 指令读取某个位置,则仅当已知该地址已被读取时,后续的 STREX 指令才能写入该地址。未受影响。
我是一名优秀的程序员,十分优秀!