我正在开发基于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位浮点写也是原子的
最佳答案
有关详细信息,请参见Architecture Reference Manual:简而言之,任何对齐的32位内存访问都是原子性的,其含义是结果要么是旧值的所有4个字节,要么是新值的所有4个字节,并且永远不要混合使用二。未对齐的访问不具有此保证。
这是纯粹的读取或写入操作-对于任何类型的读取-修改-写入序列,您都需要一个load / store-exclusive循环以使指令序列看起来像原子的。同样,如果共享数据指针在读取和将实际值读/写到它所指向的位置之间可能会在您的脚下改变,那么出于安全性的考虑,您需要将整个操作包装在一个排他的序列中。