реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Debug IAR MSP430F5438 - что за хрень с отладкой, Неуловимый Джо в ISR
k155la3
сообщение Jan 31 2016, 12:39
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



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

(?)
Работа switch() в ISR.
Почему при отладке упорно влетает в точку BP2, хотя должно
(хотя кто нам чего должен ?) вродекак в BP1.
Были у кого такие грабли, или просто я такой счасливый ?




Go to the top of the page
 
+Quote Post
Baser
сообщение Jan 31 2016, 21:23
Сообщение #2


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



С 5-м семейством не работал, только с 1-м и 2-м, но такая структура как регистр UCB1IV там есть в таймерах.
Так вот, есть предположение, что у вас возникает одновременно или почти одновременно два прерывания модуля USCI,
причем первым возникает прерывание со смещением не равным 4.
И вот вы попадаете в этом прерывании на брейкпоинт, а до того проц уже прочел регистр UCB1IV,
сбросил флаг первого прерывания и изменил регистр UCB1IV на значение 4. Тут вы эту ситуацию и смотрите (на скриншоте).

Т.е. дальше вы снова должны попасть в это прерывание но уже в case 4
Как то так...
Go to the top of the page
 
+Quote Post
sasa_c
сообщение Feb 3 2016, 06:58
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 14-11-09
Пользователь №: 53 615



Согласен с Baser, Возможно необходимо добавить поля case с всеми возможными состояниями UCB1IV, даже если эти комбинации в этом векторе не используются. В этих полях после case поставить break;
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 3 2016, 07:25
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(Baser @ Feb 1 2016, 01:23) *
С 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

. . . . . .
Go to the top of the page
 
+Quote Post
mcheb
сообщение Feb 3 2016, 14:46
Сообщение #5


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Цитата(k155la3 @ Feb 3 2016, 11:25) *
Вчера провел изыскания.

Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 4 2016, 07:39
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(mcheb @ Feb 3 2016, 17:46) *
Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?

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

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


Go to the top of the page
 
+Quote Post
mcheb
сообщение Feb 4 2016, 07:54
Сообщение #7


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 30-05-06
Пользователь №: 17 602



Не знаю, а так работает
Код
#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;
}
Go to the top of the page
 
+Quote Post
k155la3
сообщение Feb 4 2016, 07:59
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 123
Регистрация: 8-03-09
Из: Днепр
Пользователь №: 45 848



Цитата(mcheb @ Feb 4 2016, 11:54) *
Не знаю, а так работает


Ok - спасиб sm.gif

Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 24th June 2025 - 23:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01429 секунд с 7
ELECTRONIX ©2004-2016