Таблица векторов прагмы и прерываний: TI MSP430 - PullRequest
1 голос
/ 11 августа 2011

Моя программа содержит несколько глобальных переменных, значения которых устанавливаются во время выполнения процедуры обработки прерывания (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 ]

2 голосов
/ 11 августа 2011

Внутри прерывания вы прямо или косвенно меняете несколько глобальных переменных, например, ptr, flag, и я предполагаю, что rxBuffer [?].Они не объявлены как «изменчивые», поэтому их значение может измениться или не измениться при возврате из прерывания.Это ошибка, потому что поведение может меняться в зависимости от того, где при выполнении кода происходит прерывание и каков уровень оптимизации.Как правило, любая переменная, измененная подпрограммой прерывания, всегда должна объявляться как volatile.

0 голосов
/ 24 августа 2011

Благодаря всем отзывам, которые я получил от участников.Ну, идея объявить все "переменные изменчивыми" достигла целиstrcmp() использует const var *, поэтому я не смог его использовать.Мне пришлось написать свою собственную функцию сравнения строк.Все эти мелочи решили мои проблемы.

0 голосов
/ 12 августа 2011

Если вы уверены, что энергозависимые переменные не работают, то я подозреваю, что вы где-то переопределили глобальную переменную как локальную переменную.Проверьте адрес переменной-флага во время отладки и убедитесь, что он одинаков в __set_flag () и вне прерывания, где, по вашему мнению, оно не было обновлено.

Я также думаю, что цикл опроса ву вашего ISR плохой код, и вы должны найти лучший способ дождаться готовности передатчика к следующему символу.

...