gpt4 book ai didi

gcc - Cortex-M3 的 CMSIS 库中的数据内存屏障 (DMB)

转载 作者:行者123 更新时间:2023-12-03 01:00:17 26 4
gpt4 key购买 nike

在 gcc 的 CMSIS 定义中,您可以找到如下内容:

static __INLINE void __DMB(void) { __ASM volatile ("dmb"); }

我的问题是:如果内存屏障不在破坏列表中声明“内存”,那么它有什么用处?

这是 core_cm3.h 中的错误还是 gcc 在没有任何额外帮助的情况下应该正确运行的原因?

最佳答案

我用 gcc 4.5.2(用 LTO 构建)做了一些测试。如果我编译这段代码:

static inline void __DMB(void) { asm volatile ("dmb"); }
static inline void __DMB2(void) { asm volatile ("dmb" ::: "memory"); }

char x;

char test1 (void)
{
x = 15;
return x;
}

char test2 (void)
{
x = 15;
__DMB();
return x;
}

char test3 (void)
{
x = 15;
__DMB2();
return x;
}

使用arm-none-eabi-gcc -Os -mcpu=cortex-m3 -mthumb -c dmb.c,然后从arm-none-eabi-objdump -d dmb。 o 我明白了:

00000000 <test1>:
0: 4b01 ldr r3, [pc, #4] ; (8 <test1+0x8>)
2: 200f movs r0, #15
4: 7018 strb r0, [r3, #0]
6: 4770 bx lr
8: 00000000 .word 0x00000000

0000000c <test2>:
c: 4b02 ldr r3, [pc, #8] ; (18 <test2+0xc>)
e: 200f movs r0, #15
10: 7018 strb r0, [r3, #0]
12: f3bf 8f5f dmb sy
16: 4770 bx lr
18: 00000000 .word 0x00000000

0000001c <test3>:
1c: 4b03 ldr r3, [pc, #12] ; (2c <test3+0x10>)
1e: 220f movs r2, #15
20: 701a strb r2, [r3, #0]
22: f3bf 8f5f dmb sy
26: 7818 ldrb r0, [r3, #0]
28: 4770 bx lr
2a: bf00 nop
2c: 00000000 .word 0x00000000

很明显,__DBM()仅插入dmb指令,并且需要DMB2()来实际强制编译器刷新值缓存在寄存器中。

我想我发现了 CMSIS 错误。

关于gcc - Cortex-M3 的 CMSIS 库中的数据内存屏障 (DMB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6751605/

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