[英]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.