gpt4 book ai didi

c - ARM 皮质 M3 : Atomic Writes

转载 作者:行者123 更新时间:2023-12-01 15:25:09 26 4
gpt4 key购买 nike

我正在 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 个字节,并且永远不会两者的一些混合。未对齐的访问有此保证。

这是针对纯读取或写入的——对于任何类型的读取-修改-写入序列,您需要一个加载/存储独占循环来使指令序列看起来是原子的。类似地,如果共享数据指针在读取它和读取/写入实际值到它指向的位置之间容易发生变化,为了安全,您需要将整个操作包装在一个独占序列中。

关于c - ARM 皮质 M3 : Atomic Writes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29563511/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com