|
发表于 2009-5-13 12:47:05
|
显示全部楼层
编译环境是 arm-elf-gcc 4.2.2
#define rSRCPND (*(volatile unsigned *)0x4a000000) //Interrupt request status
#define rINTPND (*(volatile unsigned *)0x4a000010) //Interrupt request status
void KeyScan_Test(void)
{
ClearPending(0x55);
}
#define ClearPending(bit) \
rSRCPND = bit ; \
rINTPND = bit ; \
rINTPND ;\
设置优化等级为 -O2
30000e60 <KeyScan_Test>:
30000e60: e3a0344a mov r3, #1241513984 ; 0x4a000000
30000e64: e3a02055 mov r2, #85 ; 0x55
30000e68: e5832000 str r2, [r3]
30000e6c: e5832010 str r2, [r3, #16]
30000e70: e5931010 ldr r1, [r3, #16]
30000e74: e12fff1e bx lr
不设置优化等级
30001758 <KeyScan_Test>:
30001758: e1a0c00d mov ip, sp
3000175c: e92dd800 push {fp, ip, lr, pc}
30001760: e24cb004 sub fp, ip, #4 ; 0x4
30001764: e3a0244a mov r2, #1241513984 ; 0x4a000000
30001768: e3a03055 mov r3, #85 ; 0x55
3000176c: e5823000 str r3, [r2]
30001770: e59f2010 ldr r2, [pc, #16] ; 30001788 <KeyScan_Test+0x30>
30001774: e3a03055 mov r3, #85 ; 0x55
30001778: e5823000 str r3, [r2]
3000177c: e59f3004 ldr r3, [pc, #4] ; 30001788 <KeyScan_Test+0x30>
30001780: e5933000 ldr r3, [r3]
30001784: e89da800 ldm sp, {fp, sp, pc}
30001788: 4a000010 .word 0x4a000010
结论
可以看出,无论是否开优化,最后的一条指令都没有被去掉。
rINTPND ;
生成的代码是
30000e70: e5931010 ldr r1, [r3, #16]
可见,这确实是一条读寄存器的指令。
勘误一下,我之前编译的时候去掉这指令报错,但是今天我去掉发现没有报错,所以我认为这条指令不是必须的。
之前说错了。 |
|