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

共有変数を揮発性にすることがうまくいかないことが確実な場合は、どこかでグローバル変数をローカル変数として再定義したと思われます。デバッグ中にフラグ変数のアドレスを確認し、__set_flag() 内と更新されていないと思われる割り込みの外側で同じであることを確認します。

また、ISR のポーリング ループは不適切なコードであり、送信機が次の文字の準備ができるまで待機するためのより良い方法を見つける必要があると思います。

于 2011-08-11T21:44:05.240 に答える
0

メンバーからいただいたすべてのフィードバックに感謝します。すべての「変数を揮発性」と宣言するというアイデアはうまくいきました。strcmp()const var* を使用しているため、使用できませんでした。独自のカスタム文字列比較関数を作成する必要がありました。この小さなことすべてが私の問題を解決しました。

于 2011-08-24T18:12:15.050 に答える