|
|
  |
IAR, J-Link и прерывания |
|
|
|
Jun 7 2006, 11:53
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Прежде чем пойти и тихо удавиться решил попросить совета здесь. В результате ряда манипуляций с программой, отлаживаемой в IAR ARM v.4.11a с помощью J-Link из IAR-KIT добился следующего: В отладчике не работают никакие прерывания, хотя все служебные регистры читаются как надо. Вне отладчика - все работает как надо. Еще несколько часов назад и в отладчике все было отлично. Что случилось, понять не могу, уже близок к суициду Буду рад любым соображениям по теме...
|
|
|
|
|
Jun 7 2006, 13:16
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sgrig @ Jun 7 2006, 14:53)  Прежде чем пойти и тихо удавиться решил попросить совета здесь. Бывает не работает часть прерываний, бывает все. Бился (и инициализация, и сбросы, и со скриптами перед запуском отладчика колдовал) долго и безнадежно. Помогла только 5 версия железа J-Link, точнее поддержка этим железом опции "adaptive clocking". Все взяло и заработало. Эффект несколько ослабевал при использовании segger-овских DDLок посвежее - посетите segger.com.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 8 2006, 03:10
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Все страньше и страньше..
Воспользовался Вашим советом, обновил драйвер с СЕГГЕРа. Легче не стало.
НО! Пару месяцев назад я угробил несколько дней, пытаясь заставить работать RDI. Так и не смог. А тут ткнулся по старой памяти и все пошло влегкую - молниеносная загрузка и куча точек останова.
Естественно, в RDI появилась опция Adaptive clocking, только с ней все очень медленно (у меня JLink 3-ей версии). Но прерывания все равно не работают в отладчике.
|
|
|
|
|
Jun 8 2006, 06:35
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(sgrig @ Jun 8 2006, 06:10)  Естественно, в RDI появилась опция Adaptive clocking, только с ней все очень медленно (у меня JLink 3-ей версии). Но прерывания все равно не работают в отладчике. А в V3 в принципе нет (мне так кажется) поддержки Adaptive clocking. Что-то как-то выставляет и как-то в принципе работает, но на эффекте прерываний не сказывается. Про V5 я писал, поскольку у меня есть старый эквивалент и новый полный клоны J-Link V5. На V5 однозначно рабочая опция и железно помогает c глюком. Кстати, у меня эффект с пропаданием проявляется 100% при 'штатном' обязательном останове на 0 адресе. При переносе его на main() еще меньше и так далее... Cо свежими драйверами спокойно преносит железный сброс и можно после зависания прерываний reset -> break -> установить brekpoint -> run и все работает. И еще, у меня эффект был завязан на процесс прошивки Flash, поэтому, если прошить а потом отключить загрузку и только отладка, то тоже без потерь прерываний. Неудобно, конечно, лазить в опции, но помогает.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jun 8 2006, 07:19
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sgrig @ Jun 7 2006, 14:53)  Прежде чем пойти и тихо удавиться решил попросить совета здесь. В результате ряда манипуляций с программой, отлаживаемой в IAR ARM v.4.11a с помощью J-Link из IAR-KIT добился следующего: В отладчике не работают никакие прерывания, хотя все служебные регистры читаются как надо. Вне отладчика - все работает как надо. Еще несколько часов назад и в отладчике все было отлично. Что случилось, понять не могу, уже близок к суициду Буду рад любым соображениям по теме... Было подобное. То генрятся то нет. Соображения такие: при сбросе отладчиком происходит только сброс ядра, но не контроллера прерываний. Если перед этим обрабатывалось какое-то прерывание и логика контроллера не была сброшена (VICVecAddr = 0 или AIC_EOICR = 0) то следующее прерывание не генерится. Поборол принудительным сбросом контроллера прерываний в процедуре инициализации.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 8 2006, 07:51
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Огромное спасибо всем за участие.
Дело кончилось тем, что я скачал и поставил EWA версии 4.40а в дополнение к новым драйверам от segger.
Все заработало как часы, вопрос в том, надолго ли. Причем в JLink-е теперь неограниченное количество точек останова, но RDI по прежнему грузит раза в 3 быстрее.
В общем уже часа полтора счастлив и наслаждаюсь стабильностью результатов, стараясь пока не думать о плохом.
|
|
|
|
|
Jun 8 2006, 12:37
|
Участник

Группа: Участник
Сообщений: 45
Регистрация: 4-11-05
Из: Tomsk
Пользователь №: 10 464

|
Если поставить точку останова в прерывании, а затем сделать сброс, прерывания перестают работать.
Поставил в стартапе EOICR = 0 и эта проблема исчезла, так что совет очень дельный.
|
|
|
|
|
Jun 8 2006, 17:32
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(zltigo @ Jun 8 2006, 15:19)  Цитата(Сергей Борщ @ Jun 8 2006, 10:19)  Поборол принудительным сбросом контроллера прерываний в процедуре инициализации.
У меня как правило работает часть прерываний. Можно, конечно попробовать и сбросы всего, что попало в скрипт инициализации добавить. Попробую на досуге. Может не совсем правильно выразился, вот sgrig понял. Под сбросом я понимал вот что: Цитата VICVectAddr: Writing to this register does not set the value for future reads from it. Rather, this register should be written near the end of an ISR, to update the priority hardware. Почему-то мне запомнилась фраза "This will reset VIC logic", хотя сейчас в мануале ее не нашел, видимо сам ассоциативно выдумал ;-). Для AT91 аналогичное происходит при записи в EOICR.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jun 8 2006, 18:43
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Попробовал. Как и следовало ожидать, строка "Write32( 0xFFFFF030, 0x00000000 );" в скрипте эффекта не оказала, зато выяснилось, что все нормально работает не только при 'Adaptive clocking', но и при зажатии JTAG на фиксированной скорости 2000KHz и более. На меньших скоростях - нестабильнось. На скоростях мене 1000KHz - полная неработоспособность. В штатной (не RDI) поддержке есть опция Auto, но с начальной скоростью, так вот, указание более высокой начальной скорости ничего не меняет.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|