gpt4 book ai didi

c - 为什么c中会出现这个错误?

转载 作者:行者123 更新时间:2023-11-30 18:53:51 25 4
gpt4 key购买 nike

我在 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:

最佳答案

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

关于c - 为什么c中会出现这个错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31719932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com