繁体   English   中英

ARM Cortex M3:原子写入

[英]ARM Cortex M3: Atomic Writes

我正在开发基于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位浮点写入也是原子的

有关详细信息,请参见《 体系结构参考手册 》:简而言之,任何对齐的 32位内存访问都是原子性的,其含义是结果要么是旧值的所有4个字节,要么是新值的所有4个字节,并且永不混合在两个中。 未对齐的访问具有此保证。

这是纯粹的读取或写入操作-对于任何类型的读取-修改-写入序列,您都需要一个load / store-exclusive循环以使指令序列看起来像原子的。 同样,如果共享数据指针在读取和将实际值读/写到其所指向的位置之间可能会在您的脚下改变,那么出于安全性的考虑,您将需要用专有的顺序包装整个操作。

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

如果要对必须模拟的64位数据类型尝试相同的操作(通常是一个包含32位高位部分和32位低位部分的结构),则应该看到该操作正在执行多条指令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM