ARM:如果禁用中断,是否需要LDRX / STRX?

时间:2014-05-28 14:18:33

标签: c multithreading arm atomic interrupt-handling

我正在使用Cortex-A9上的多线程裸机C /汇编程序。

我有一些共享变量,即从多个线程使用的地址。要执行变量值的原子交换,我使用LDRXSTRX。现在我的问题是,即使禁用了中断,每次访问其中一个变量时我都需要LDRXSTRX

假设以下示例:

  • 主题1使用LDRXSTRX来交换地址a的值。
  • 线程2禁用中断,使用普通LDRSTR交换地址a的值,执行不应中断的其他操作,然后再次启用中断。

如果线程1在线程2的LDRX之后被中断,会发生什么?线程1中的STRX是否仍然可以识别,是否存在对地址a的访问权限,或者我是否必须在线程2中使用LDRXSTRX

2 个答案:

答案 0 :(得分:0)

LDREX / STREX必须由芯片供应商实施,希望能够实现武器规范。你可以而且应该得到关于这个主题的手臂文档,在这种情况下除了手臂和trms之外你应该得到amba-axi文档。

所以,如果你有

ldrex thread 1
interrupt
ldrex thread 2
strex thread 2
return from interrupt
strex thread 1

在线程2 ldrex和strex之间没有修改该内存位置,因此strex应该可以工作。但是在线程1 strex和之前的ldrex之间已经对该位置进行了修改,线程2 strex。所以理论上这意味着线程1 strex应该失败,你必须再次尝试你的线程1 ldrex / strex对,直到它工作。但这完全是设计,你继续在循环中尝试ldrex / strex对,直到成功为止。

但这是所有实现的定义,因此您必须查看特定的芯片供应商和型号以及转速并进行自己的实验。例如,linux中的错误是ldrex / strex是一个无限循环,将它应用于不支持ldrex / strex的系统/情况,你得到OKAY而不是EXOKAY,并且strex将永远失败你会被困在那里永远无限循环(我想知道我是怎么知道的,不得不在逻辑层面调试这个问题)。

首先关闭ARM文档,单处理器系统不需要独占访问支持,因此如果您触摸单核系统上的供应商特定逻辑,则ldrex / strex对无法正常工作。如果你的ldrex / strex保持在arm逻辑(L1和可选的L2高速缓存)内,那么ldrex / strex对是由ARM而不是芯片供应商决定的单处理器,因此如果该对触及系统内存,你就属于一套规则在arm核心之外,那么你属于供应商的规则。

最大的问题是ARM的文档在该主题上异常不完整。例如,根据手册和手册中的哪个位置,您可以阅读它,例如,如果某个其他主人修改了该位置,在您的情况下它是同一个主人,那么该位置已被修改但是由于您是第二个strex应该成功。然后同一文档说另一个独占读取将监视器重置为一个不同的地址,那么如果它是另一个同一地址的独占读取呢?

基本上你的问题是关于同一地址的两次独占写入没有在它们之间进行独占读取的问题,第二次是否成功。一个非常好的问题......我无法看到所有手臂核心或基于臂的芯片的整个世界都有明确的答案。

与ldrex / strex的底线不完全是ARM内核,而是特定于芯片(供应商)。您需要进行实验以确保您可以在该系统上使用该指令对(单处理器与否)。您需要知道ARM内核的作用(缓存)以及当独占访问通过核心到达供应商逻辑时会发生什么。对您关心的每个核心和供应商重复此代码。

答案 1 :(得分:0)

抱怨只是投入了一个"它的错误"住的声明,但昨天我没有时间写一个正确的答案。 dwelch对你的问题的答案是正确的 - 但它的一部分至少可能被误解。

简短的回答是,是的,您需要为两个线程禁用中断或为两个线程使用ldrex / strex。

但要直截了当地说明:在v6或更高版本的所有ARM处理器中都必须支持ldrex / strex(v6M微控制器除外)。但是,对于某些ARMv7处理器,支持SWP是可选的。

ldrex / strex的行为取决于您的MMU是否已启用以及所访问区域配置的内存类型和属性。某些可能的配置需要将额外的支持添加到互连或RAM控制器,以便ldrex / strex能够正常运行。

整个概念基于本地和全球独家监视器的概念。如果在标记为不可共享的内存区域上运行(在单处理器配置中),则处理器只需关注本地监视器。

在多核配置中,使用架构上被认为是全局监视器的内容来管理相干区域,但仍然驻留在多核处理器内,并且不依赖于外部实现的逻辑。

现在,dwelch是正确的,因为有太多的"实现定义"这个选项。您描述的序列 NOT 在架构上保证可以正常工作。该体系结构不要求str将本地(或全局)监视器从独占状态转换为打开状态(尽管在某些实现中,它可能)。

因此,架构安全的选择是:

  1. 在两种情况下都使用ldrex / strex。
  2. 在两个上下文中禁用中断。
相关问题