为什么这个错误发生在c?

时间:2015-07-30 09:25:51

标签: c

我在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个中断例程:

  • interupt1:每1秒second2 ++
  • interupt2:从USART获取一些字符并设置:wait_to_string,error_reciv,fail_reciv。

我的汇编代码是:

; 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:

2 个答案:

答案 0 :(得分:2)

如果变量可以被另一个线程修改,则应将它们标记为volatile。如果不是,编译器可以在寄存器中使用缓存值,而不会从内存中重新加载它们。但如果它们被标记为volatile,则编译器应在每次读取时从主存储器重新加载它们。

答案 1 :(得分:0)

我将变量标记为volatile并将优化级别标记为低,我的问题就解决了。

volatile bit waito_get=0,wait_to_string=0,error_reciv=0,fail_reciv=0; 
volatile int second2=0;
volatile int sec_wait=14;
CodeVisionAvr中的


project / configure / c编译器/优化级别:低 enter image description here