我的程序包含很少的全局变量,其值在中断服务程序(USCI_A0_ISR())执行期间设置。
完成USCI_A0_ISR()的执行后,全局变量是否保持指定的值或将被设置回void / 0. ????
//Global variables
int ptr = 0;
char rxBuffer[16];
int flag = -1;
int check[2];
void __set_flag(void)
{
if (strcmp(rxBuffer,"OK") == 0) flag = 0;
else if (strcmp(rxBuffer,"CONNECT") == 0) flag = 1;
else if (strcmp(rxBuffer,"NO CARRIER") == 0) flag = 3;
else if (strcmp(rxBuffer,"ERROR") == 0) flag = 4;
}
void __GSM_client(void)
{
while (flag == -1);
if (flag == 0) check[0] = buflen(rxBuffer);
}
void main(void)
{
__Buffer_init();
__low_level_init(); //WDT
__UART0_init(); //UART
__bis_SR_register(GIE); //interrupts enabled
__delay_cycles(1000); // wait till UART intial
__GSM_client();
__no_operation(); // For debugger
}
#pragma vector=USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
char byte;
while (!(UCA0IFG&UCTXIFG));
byte= UCA0RXBUF;
UCA0TXBUF = byte;
if (byte == '\r') {
//push_char(byte);
ptr = 0;
__set_flag();
//__Buffer_init();
}
else{
push_char(byte);
}
}
以下是我正在做的代码片段。我根据获得的响应设置"flag"
。当我在Code Composer Studio中看到注册视图时,"flag"
值设置正确,但如果尝试在其他位置使用"flag"
的值,则不会反映"flag "
的值。
关于中断服务程序概念的任何指针,或者当我的编码方法中的漏洞受到赞赏时 提前致谢 的 AK
答案 0 :(得分:2)
在中断中,您直接或间接地更改了几个全局变量,例如: ptr,flag,我假设是rxBuffer [?]。它们未被声明为“volatile”,因此当您从中断返回时,它们的值可能会也可能不会更改。这是一个错误,因为行为可能会根据执行代码的中断位置以及优化级别而改变。根据经验,任何由中断例程修改的变量都应该始终声明为volatile。
答案 1 :(得分:0)
如果您确定使共享变量volatile不起作用,那么我怀疑您已将某个全局变量重新定义为局部变量。在调试时检查标志变量的地址,并确保它在__set_flag()中是相同的,并且在中断的情况下,你认为它没有被更新。
我还认为你的ISR中的轮询循环代码很差,你应该找到一种更好的方法来等待发射机为下一个角色做好准备。
答案 2 :(得分:0)
感谢我从会员那里获得的所有反馈。那么声明所有 “变量volatile” 的想法就可以了。 strcmp()
使用const var *所以我无法使用它。我必须编写自己的自定义字符串比较函数。所有这些小事都解决了我的问题。