ARM Cortex M3:原子写入
ARM Cortex M3: Atomic Writes
我正在 ARM Cortex-M3 架构 (LPC1769) 上开发一个共享数据库,我想知道我是否需要互斥或锁定写入。
32 位浮点数 read/write 是原子的吗?
-- 编辑 --
我为 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 循环来使指令序列看起来是原子的。同样,如果共享数据指针在读取它和 reading/writing 它指向的位置的实际值之间容易发生变化,为了安全起见,您需要将整个操作包装在一个独占序列中。
cortex M3 原生支持 32 位操作,因此,在处理 32 位数据类型时,操作应在一条指令中执行;这意味着它是原子的。
如果您尝试对必须模拟的 64 位数据类型进行同样的操作(通常是包含 32 位高位部分和 32 位低位部分的结构),您应该会看到为该操作执行了多条指令。
我正在 ARM Cortex-M3 架构 (LPC1769) 上开发一个共享数据库,我想知道我是否需要互斥或锁定写入。
32 位浮点数 read/write 是原子的吗?
-- 编辑 -- 我为 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 循环来使指令序列看起来是原子的。同样,如果共享数据指针在读取它和 reading/writing 它指向的位置的实际值之间容易发生变化,为了安全起见,您需要将整个操作包装在一个独占序列中。
cortex M3 原生支持 32 位操作,因此,在处理 32 位数据类型时,操作应在一条指令中执行;这意味着它是原子的。
如果您尝试对必须模拟的 64 位数据类型进行同样的操作(通常是包含 32 位高位部分和 32 位低位部分的结构),您应该会看到为该操作执行了多条指令。