|
楼主 |
发表于 2008-1-30 16:32:03
|
显示全部楼层
原子操作要注意确保里面的语句不被编译器优化掉。
ATOMIC()
{
………………//要注意确保里面的语句不被编译器优化掉,否者并没有进行原子操作
}
一个简单例子:
uint8 test( uint8 data)
{
uint8 var;
ATOMIC()
{
var=data; //编译器优化掉了
}
return var*var;
}
IAR下编译出来的汇编代码是:
test:
IN R17, 0x3F
CLI
OUT 0x3F, R17
MUL R16, R16
MOV R16, R0
RET
uint8 test(volatile uint8 data)
{
uint8 var;
ATOMIC()
{
var=data;
}
return var*var;
}
IAR下编译出来的汇编代码是:
test:
SBIW R29:R28, 1
ST Y, R16
IN R16, 0x3F
CLI
LD R17, Y
OUT 0x3F, R16
MUL R17, R17
MOV R16, R0
ADIW R29:R28, 1
RET
这种写法同上。
uint8 flags=SREG;
cli();
……………… //要注意确保里面的语句不被编译器优化掉,否者并没有进行原子操作
SREG=flags;
这种写法同上。
cli();
……………… //要注意确保里面的语句不被编译器优化掉,否者并没有进行原子操作
sei(); |
|