ARM Cortex M3:原子写入

时间:2015-04-10 14:03:54

标签: c arm atomicity

我正在ARM Cortex-M3架构(LPC1769)上开发共享数据库,我想知道我是否需要互斥锁或锁定写入。

32位浮点读/写原子?

- 编辑 - 我为uint32_t和float:

的写入函数添加了反汇编
00000000 <setSharedDataUint>:
   0:   b480        push    {r7}
   2:   b083        sub sp, #12
   4:   af00        add r7, sp, #0
   6:   4603        mov r3, r0
   8:   6039        str r1, [r7, #0]
   a:   71fb        strb    r3, [r7, #7]
   c:   79fb        ldrb    r3, [r7, #7]
   e:   4a05        ldr r2, [pc, #20]   ; (24 <setSharedDataUint+0x24>)
  10:   00db        lsls    r3, r3, #3
  12:   4413        add r3, r2
  14:   683a        ldr r2, [r7, #0]
  16:   605a        str r2, [r3, #4]
  18:   370c        adds    r7, #12
  1a:   46bd        mov sp, r7
  1c:   f85d 7b04   ldr.w   r7, [sp], #4
  20:   4770        bx  lr
  22:   bf00        nop
  24:   00000000    .word   0x00000000
            24: R_ARM_ABS32 .bss.dataArray

 00000000 <setSharedDataFloat>:
   0:   b480        push    {r7}
   2:   b083        sub sp, #12
   4:   af00        add r7, sp, #0
   6:   4603        mov r3, r0
   8:   6039        str r1, [r7, #0]
   a:   71fb        strb    r3, [r7, #7]
   c:   79fb        ldrb    r3, [r7, #7]
   e:   4a05        ldr r2, [pc, #20]   ; (24 <setSharedDataFloat+0x24>)
  10:   00db        lsls    r3, r3, #3
  12:   4413        add r3, r2
  14:   683a        ldr r2, [r7, #0]
  16:   605a        str r2, [r3, #4]
  18:   370c        adds    r7, #12
  1a:   46bd        mov sp, r7
  1c:   f85d 7b04   ldr.w   r7, [sp], #4
  20:   4770        bx  lr
  22:   bf00        nop
  24:   00000000    .word   0x00000000
            24: R_ARM_ABS32 .bss.dataArray

它们看起来相同,这使我假设32位浮点写也是原子

2 个答案:

答案 0 :(得分:5)

有关详细信息,请参阅Architecture Reference Manual:简而言之,任何对齐 32位内存访问都是原子的,因为结果是旧值的全部4个字节,或者新值的所有4个字节,从不混合两个。未对齐的访问具有此保证。

纯粹的读取或写入 - 对于任何类型的读取 - 修改 - 写入序列,您需要一个加载/存储专用循环来使指令序列看起来是原子的。类似地,如果共享数据指针在读取它之间以及读取/写入实际值到它指向的位置之间可能会发生变化,那么为了安全起见,您需要将整个操作包装在一个独占的序列中。

答案 1 :(得分:0)

cortex M3本身支持32位操作,因此,当使用32位数据类型时,操作应该在一条指令中执行;这意味着它是原子的。

如果您要对64位数据类型进行相同的尝试(必须进行仿真(通常是包含32位高位和32位低位的结构),您应该看到为该操作执行了多条指令。