簡體   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