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

 
 
> 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
 
Start new topic
Ответов
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
k155la3
сообщение Feb 3 2016, 07:25
Сообщение #3


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

Группа: Свой
Сообщений: 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
Сообщение #4


Местный
***

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



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

Неужели так сложно прочитать даташит? И зачем директива switch event и тд закомментировали?
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 6th July 2025 - 12:07
Рейтинг@Mail.ru


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