- 论坛徽章:
- 0
|
我做了如下的试验:
源代码:
#include <stdio.h>
int main()
{
unsigned int *addp = (unsigned int*)0x80000000;
int val1,val2;
val1 = *addp;
val2 = *addp;
return val1+val2*2;
}
arm-none-linux-gnueabi-gcc -O2 volatile_test.c -o volatile
arm-none-linux-gnueabi-objdump -D volatile > volatile.dmp
cat volatile.dmp:
000083fc <main>:
83fc: e3a03102 mov r3, #-2147483648 ; 0x80000000
8400: e5930000 ldr r0, [r3]---------------------->去到内存,只取了一次值
8404: e0800080 add r0, r0, r0, lsl #1
8408: e12fff1e bx lr
将以上源代码添加volatile关键字,修改如下:
#include <stdio.h>
int main()
{
volatile unsigned int *addp = (volatile unsigned int*)0x80000000;
int val1,val2;
val1 = *addp;
val2 = *addp;
return val1+val2*2;
}
重复执行以上过程,反汇编,然后cat volatile.dmp:
000083fc <main>:
83fc: e3a03102 mov r3, #-2147483648 ; 0x80000000
8400: e5932000 ldr r2, [r3]------------------------->去到内存取第一次值
8404: e5930000 ldr r0, [r3]------------------------->去到内存取第二次值
8408: e0820080 add r0, r2, r0, lsl #1
840c: e12fff1e bx lr
注意以上的编译过程,都需要加上优化编译开关:-O2
回复 4# unbutun
|
|