【发布时间】:2014-05-28 14:18:33
【问题描述】:
我正在使用 Cortex-A9 上的多线程裸机 C/Assembler 应用程序。
我有一些共享变量,即多个线程使用的地址。要执行变量值的原子交换,我使用LDRX 和STRX。现在我的问题是,即使中断被禁用,每次访问其中一个变量时是否需要LDRX 和STRX。
假设以下示例:
- 线程1使用
LDRX和STRX交换地址a的值。 - 线程 2 禁用中断,使用正常的
LDR和STR交换地址 a 的值,执行不应该中断的其他操作,然后再次启用中断。
如果线程 1 在LDRX 之后被线程 2 中断,会发生什么?线程 1 中的 STRX 是否仍然可以识别地址 a 上的访问权限,或者我是否也必须在线程 2 中使用 LDRX 和 STRX?
【问题讨论】:
-
如果你的 mainline 使用
LDRX/STRX,那么你必须在中断中做同样的事情。LDRX保留内存位置。为了让STRX发出重试信号,使用内存的每个人都必须使用LDRX;你不能混搭访问。MRC p15, 0, <Rd>, c0, c0, 1返回 ERG,这是LDRX/STRX保留的大小。阅读exclusive montiors。 -
请参阅:LDREX/STREX and cache、ERG question、Linux atomic_inc question。
LDRX/STRX的一些概念有点陌生。根据 Linux atomic_inc 问题,我认为您正在考虑 atomic 与 lock-free;在那里查看我投反对票的 wiki 答案。 -
ldrex 和 strex 可以确保在多核处理器中,您的核心代码可以独占访问内存位置,基本上没有其他人在您执行两个单独的事务之间干扰该位置。中断模式等与它无关,要么你需要使用这对指令,要么你不需要。
-
这个论点我们已经无数次了,ldrex/strex 对于单处理器系统是可选的,在该领域也有不支持的系统。
-
如果您保留在 arm 逻辑中,则缓存将起作用,如果/当它触及供应商逻辑时,它可能会或可能不会,它可能会遵循一组不同的规则或对规则的解释.一般来说,缓存是打开的,供应商逻辑永远不会看到独占访问,所以它都在 arm 域中。
标签: c multithreading arm atomic interrupt-handling