Pragma和中断向量表:TI MSP430

时间:2011-08-11 15:45:56

标签: c embedded pragma msp430

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

我还认为你的ISR中的轮询循环代码很差,你应该找到一种更好的方法来等待发射机为下一个角色做好准备。

答案 2 :(得分:0)

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