Raspberry Pi ldrex导致数据中止

问题描述:

我有一个简单的裸机Raspberry Pi项目,我试图实现自旋锁。这是我的代码:Raspberry Pi ldrex导致数据中止

spinlock_lock: 
    push {r4, r5, lr} 

    mov r5, #0x1 
1: 
    ldrex r4, [r0] 
    teq r4, #0 
    strexeq r4, r5, [r0] 
    teqeq r4, #0 
    bne 1b 

    pop {r4, r5, pc} 

的问题是,ldrex导致数据异常。我传递的指针是页面对齐的,ARM以系统模式运行。奇怪的是,用一个使用非独占加载/存储的版本替换这个代码,它的工作原理。使用独家货物和商店时,有什么需要注意的地方?

+0

MMU是否在,如果是的话,那么页面映射为什么内存类型? – Notlikethat 2014-09-24 09:35:19

+0

@Notlikethat没有虚拟内存在进行,它是所有的物理地址。 – JustSid 2014-09-24 09:39:34

[忽略为清楚起见这里非MMU架构]

独家访问指令只能保证在正常工作的内存。在ARMv7-A中,除非系统文档明确说明它支持此功能,否则预计将强制排序或设备内存无法预测的排他性,这是实现定义它们是否可以在强排序或设备内存上工作。此处适用的ARMv6更为严格:

LDREX和STREX操作只应在支持Normal内存属性的内存上执行。

当MMU关闭时,指令访问被视为正常,但数据访问被视为强排序。因此,尝试在MMU中使用独占功能很可能会很流行 - 为了使用它们,我认为除了为具有正确属性的身份映射设置一些最小页表之外别无选择。

+0

啊哈!我知道我错过了一些东西。万分感谢! – JustSid 2014-09-24 15:34:22