Перейти к содержанию
    

Debug IAR MSP430F5438 - что за хрень с отладкой

IAR, MSP340F5438A, "Debug" с отключенной оптимизацеий.

 

(?)

Работа switch() в ISR.

Почему при отладке упорно влетает в точку BP2, хотя должно

(хотя кто нам чего должен ?) вродекак в BP1.

Были у кого такие грабли, или просто я такой счасливый ?

 

 

 

UCB1_IV_trable1.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С 5-м семейством не работал, только с 1-м и 2-м, но такая структура как регистр UCB1IV там есть в таймерах.

Так вот, есть предположение, что у вас возникает одновременно или почти одновременно два прерывания модуля USCI,

причем первым возникает прерывание со смещением не равным 4.

И вот вы попадаете в этом прерывании на брейкпоинт, а до того проц уже прочел регистр UCB1IV,

сбросил флаг первого прерывания и изменил регистр UCB1IV на значение 4. Тут вы эту ситуацию и смотрите (на скриншоте).

 

Т.е. дальше вы снова должны попасть в это прерывание но уже в case 4

Как то так...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласен с Baser, Возможно необходимо добавить поля case с всеми возможными состояниями UCB1IV, даже если эти комбинации в этом векторе не используются. В этих полях после case поставить break;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С 5-м семейством не работал, только с 1-м и 2-м, но такая структура как регистр UCB1IV там есть в таймерах.

Так вот, есть предположение, что у вас возникает одновременно или почти одновременно два прерывания модуля USCI,

причем первым возникает прерывание со смещением не равным 4.

И вот вы попадаете в этом прерывании на брейкпоинт, а до того проц уже прочел регистр UCB1IV,

сбросил флаг первого прерывания и изменил регистр UCB1IV на значение 4. Тут вы эту ситуацию и смотрите (на скриншоте).

 

Т.е. дальше вы снова должны попасть в это прерывание но уже в case 4

Как то так...

 

 

Baser, sasa_c, спасибо за ответы. Так и есть.

 

Вчера провел изыскания.

Если возникает одновременно 2 прерывания, то они отображаются в UCB1IFG,

а в обработчик вход идет с UCB1IV == 0x00. Это означает нечто вроде "есть несколько прерываний. Уточнить по UCB1IFG"

Чтобы все работало, надо в case-0 сбросить один из флагов. Тогда сразу генерируется

следующее прерывание (пере-вход в обработчик с "новым" UCB1IV == 0x04),

соотв-ее "очередному" флагу в UCB1IFG. В моем случае это UCNACKIFG.

 

 

    
  . . . . . . 
switch( UCB1IV )
  {
   case  0:
        {
        OSC_D2_L1;
        rr = rr + 2; rssi = 100;
                __no_operation();
                UCB1IFG &= ~UCTXIFG;
        OSC_D2_L0;
        }
        break;
      case  4:
        {
        OSC_D2_L1;
        rr = rr + 1; rssi = 104;
                __no_operation();
                UCB1IFG &= ~UCNACKIFG;
        OSC_D2_L0;
        }
        break;                           // Vector  4: NACKIFG

. . . . . .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вчера провел изыскания.

Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?

Согласен. Из-за "одноразовости" чтения UCB1IV надо использовать в switch директиву __even_in_range( UCB1IV, 12).

Она дает "вычисляемый" переход по switch.

 

(?)

Что означает вход по UCV1IV == 0x00, "No interrupt pending"

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не знаю, а так работает

#pragma vector = USCI_A0_VECTOR
__interrupt void USCI_A0_ISR(void)
{
    uint8_t u;
    switch(UCA0IV>>1)
    {
    case 0:
        break;
    case UCRXIFG:
        u=ToUpper(UCA0RXBUF);   // RXed character rxBuf[0]
        if(u=='\n' || u =='\r') cmdUart=1;
        uartRxBuf[uartRxIn++] = u;
        break;
    case UCTXIFG:
        UCA0IE &=~UCTXIE;
//        if(uartTxOut==uartTxIn) UCA0IE &=~UCTXIE;
//        else UCA0TXBUF=uartTxBuf[uartTxOut++];
        break;
    default:
        break;
    }
    LPM3_EXIT;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...