我在CodeVisionAvr中编写了这段代码:
//Global Variable
int second2=0;
int sec_wait=14;
bit waito_get=0,wait_to_string=0,error_reciv=0,fail_reciv=0;
.
.
.
// in a function
while (second2 < sec_wait) {
if (wait_to_string || error_reciv || fail_reciv)
second2= sec_wait;
};
if (wait_to_string == 0) {
printf("second2 %d sec_wait %d error_reciv %d fail_reciv %d \r\n",
second2, sec_wait, error_reciv, fail_reciv);
};
计划的输出是:
second2 1 sec_wait 14 error_reciv 0 fail_reciv 0
当条件为打印的值为真时,它如何退出while
循环?
我也有2个中断例程:
我的汇编代码是:
; 0000 01EC while(second2 < sec_wait){
_0x87:
CALL SUBOPT_0xC
CALL SUBOPT_0x5
CP R26,R30
CPC R27,R31
BRGE _0x89
; 0000 01ED if(wait_to_string || error_reciv || fail_reciv)
SBRC R3,7
RJMP _0x8B
SBRC R4,0
RJMP _0x8B
SBRS R4,1
RJMP _0x8A
_0x8B:
; 0000 01EE second2 = sec_wait;
CALL SUBOPT_0xC
STS _second2,R30
STS _second2+1,R31
; 0000 01EF };
_0x8A:
RJMP _0x87
_0x89:
答案 0 :(得分:2)
如果变量可以被另一个线程修改,则应将它们标记为volatile。如果不是,编译器可以在寄存器中使用缓存值,而不会从内存中重新加载它们。但如果它们被标记为volatile,则编译器应在每次读取时从主存储器重新加载它们。
答案 1 :(得分:0)