看看,两种循环结构,编译后的结果大相径庭: 第一种,由于改变了关中断,开中断的操作顺序,导致不能工作:
while(SPMCSR & RWWSB) 403 { 404 cli(); 405 SPMCSR = (1 << RWWSRE)|(1 << SPMEN); ??main_1: 0000007E E101 LDI R16, 17 00000080 93000068 STS 104, R16 406 asm("spm"); 00000084 95E8 spm 407 sei(); 00000086 9478 SEI 408 } ??main_2: 00000088 91000068 LDS R16, 104 0000008C 7006 ANDI R16, 0x06 0000008E 94F8 CLI 00000090 F7B1 BRNE ??main_1
改成do{}while(xx)后,问题解决: do{ 403 cli(); ??main_2: 0000008A 94F8 CLI 404 SPMCSR = (1 << RWWSRE)|(1 << SPMEN); 0000008C E101 LDI R16, 17 0000008E 93000068 STS 104, R16 405 asm("spm"); 00000092 95E8 spm 406 sei(); 00000094 9478 SEI 407 }while(SPMCSR & RWWSB); 00000096 91000068 LDS R16, 104 0000009A 7006 ANDI R16, 0x06 0000009C F7B1 BRNE ??main_2 |