1

我的程序包含很少的全局变量,它们的值是在中断服务程序 (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

4

3 回答 3

2

在中断中,您直接或间接更改了几个全局变量,例如 ptr、flag,我假设为 rxBuffer[?]。它们没有被声明为“易失性”,因此当您从中断返回时,它们的值可能会或可能不会改变。这是一个错误,因为行为可能会根据中断发生的代码执行位置和优化级别而改变。根据经验,任何由中断例程修改的变量都应始终声明为 volatile。

于 2011-08-11T16:14:52.313 回答
0

如果您确定使共享变量 volatile 不起作用,那么我怀疑您已在某处将全局变量重新定义为局部变量。在调试时检查标志变量的地址,并确保它在 __set_flag() 和中断之外是相同的,您认为它没有被更新。

我还认为 ISR 中的轮询循环代码很差,您应该找到一种更好的方法来等待发送器为下一个字符做好准备。

于 2011-08-11T21:44:05.240 回答
0

感谢我从成员那里得到的所有反馈。那么声明所有“变量易变”的想法就成功了。strcmp()使用 const var* 所以我不能使用它。我必须编写自己的自定义字符串比较函数。所有这些小事都解决了我的问题。

于 2011-08-24T18:12:15.050 回答