k155la3 27 31 января, 2016 Опубликовано 31 января, 2016 · Жалоба IAR, MSP340F5438A, "Debug" с отключенной оптимизацеий. (?) Работа switch() в ISR. Почему при отладке упорно влетает в точку BP2, хотя должно (хотя кто нам чего должен ?) вродекак в BP1. Были у кого такие грабли, или просто я такой счасливый ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Baser 5 31 января, 2016 Опубликовано 31 января, 2016 · Жалоба С 5-м семейством не работал, только с 1-м и 2-м, но такая структура как регистр UCB1IV там есть в таймерах. Так вот, есть предположение, что у вас возникает одновременно или почти одновременно два прерывания модуля USCI, причем первым возникает прерывание со смещением не равным 4. И вот вы попадаете в этом прерывании на брейкпоинт, а до того проц уже прочел регистр UCB1IV, сбросил флаг первого прерывания и изменил регистр UCB1IV на значение 4. Тут вы эту ситуацию и смотрите (на скриншоте). Т.е. дальше вы снова должны попасть в это прерывание но уже в case 4 Как то так... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sasa_c 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Согласен с Baser, Возможно необходимо добавить поля case с всеми возможными состояниями UCB1IV, даже если эти комбинации в этом векторе не используются. В этих полях после case поставить break; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба С 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 . . . . . . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 3 февраля, 2016 Опубликовано 3 февраля, 2016 · Жалоба Вчера провел изыскания. Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали? Согласен. Из-за "одноразовости" чтения UCB1IV надо использовать в switch директиву __even_in_range( UCB1IV, 12). Она дает "вычисляемый" переход по switch. (?) Что означает вход по UCV1IV == 0x00, "No interrupt pending" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mcheb 0 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Не знаю, а так работает #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; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 27 4 февраля, 2016 Опубликовано 4 февраля, 2016 · Жалоба Не знаю, а так работает Ok - спасиб :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться