|
|
  |
Проблемы с UART под отладкой, Залипает прерывание |
|
|
|
Apr 9 2009, 05:45
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(b-volkov @ Apr 9 2009, 09:40)  А во если ее сбросить, то прерывание UART «залипает». Перезапустить программу в отладчике? Такого нет. Сбрасывайте все регистры UART и VIC при инициализации.
|
|
|
|
|
Apr 10 2009, 09:51
|

Местный
  
Группа: Участник
Сообщений: 219
Регистрация: 20-11-07
Пользователь №: 32 484

|
Цитата(b-volkov @ Apr 10 2009, 13:44)  В смысле, кнопка не на плате, а на панели инструментов отладчика. В том смысле, что у меня все нормально. Цитата(b-volkov @ Apr 10 2009, 13:44)  А что значит "сбрасывать" Для LPC2132 (вроде, одинаково с 2148). Код VICSoftIntClear = ~0u; VICIntEnClear = ~0u; VICIntEnable = 0u; VICIntSelect = 0u; VICVectAddr = 0u;
|
|
|
|
|
Apr 17 2009, 09:05
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Здравствуйте.
Во-первых, при остановке по брейкпоинту или ещё как программисты любят наблюдать вкладки периферии и Watch. Я тоже. Не не забывайте, что содержимое этой вкладки, которую вам показывает дебаггер после бряка, он (дебаггер) достаёт через JTAG. Это значит, что он заставляет ядро процессора лезть и перечитывать всю периферию, которая отображается в отладчике, включая панель Watch. Как вы думаете, что будет, если процессор покажет вам состояние, скажем, регистра чтения FIFO, или VICVectAddr? В первом случае ваша программа после продолжения выполнения может эти данные уже не прочитать. Во втором случае ситуация может оказаться ещё интереснее: внутренняя логика VIC управляется чтением и записью будет переключена чтением этого регистра, что должно быть сделано в прерывании, и чтобы сбросить логику, нужно опять же выполнить запись в этот регистр, что должно быть сделано в последних инструкциях обработчика.
Отсюда вывод: при остановке в прерывании у вас НЕ ДОЛЖНЫ ОТОБРАЖАТЬСЯ в отладчике как либо любые регистры, чтение которых меняет логику работы периферии.
Сообщение отредактировал IgorMarx - Apr 17 2009, 09:05
|
|
|
|
|
Apr 17 2009, 10:54
|
self made
   
Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795

|
Цитата(IgorMarx @ Apr 17 2009, 04:05)  Здравствуйте.
Во-первых, при остановке по брейкпоинту или ещё как программисты любят наблюдать вкладки периферии и Watch. Я тоже. Не не забывайте, что содержимое этой вкладки, которую вам показывает дебаггер после бряка, он (дебаггер) достаёт через JTAG. Это значит, что он заставляет ядро процессора лезть и перечитывать всю периферию, которая отображается в отладчике, включая панель Watch. Как вы думаете, что будет, если процессор покажет вам состояние, скажем, регистра чтения FIFO, или VICVectAddr? В первом случае ваша программа после продолжения выполнения может эти данные уже не прочитать. Во втором случае ситуация может оказаться ещё интереснее: внутренняя логика VIC управляется чтением и записью будет переключена чтением этого регистра, что должно быть сделано в прерывании, и чтобы сбросить логику, нужно опять же выполнить запись в этот регистр, что должно быть сделано в последних инструкциях обработчика.
Отсюда вывод: при остановке в прерывании у вас НЕ ДОЛЖНЫ ОТОБРАЖАТЬСЯ в отладчике как либо любые регистры, чтение которых меняет логику работы периферии. Это не верно, по крайней мере в общем случае. Если это так для ЛПЦ, то это очень странно. Механизм JTAG не использует никакие функции ядра. Это соверщенно независимая система. О том что какой-то регистр бы прочитан через JTAG, ядро узнать никак не может. Другое дело что если вы пишете в регистр который управляется записью или чтением, то опять таки это не тоже самое, как если бы ядро его записало. В этом случае возможны как раз серьезные глюки, в зависимости от того, как устроен процессор. Что вы и наблюдаете. Кстати, а зачем было подвергать прогрмамму такому издевательству -- сбрасывать прерывание?
|
|
|
|
|
Apr 17 2009, 11:07
|

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

|
Цитата(ar__systems @ Apr 17 2009, 13:54)  Механизм JTAG не использует никакие функции ядра. Это соверщенно независимая система. О том что какой-то регистр бы прочитан через JTAG, ядро узнать никак не может. В данном случае вы не правы. В правоте IgorMarx легко убедиться, запустив отладчик.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Apr 17 2009, 13:26
|
Местный
  
Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737

|
Цитата(Сергей Борщ @ Apr 17 2009, 14:07)  В данном случае вы не правы. В правоте IgorMarx легко убедиться, запустив отладчик. Поддерживаю. Проблема была обратная, смотришь периферию SPI отладчиком - байт уходит. Запускаешь прогу без отладки - не пашет. Отсель мораль, надо очищать регистр SPI состояния чтением перед каждой передачей.
|
|
|
|
|
Apr 17 2009, 16:20
|

Участник

Группа: Участник
Сообщений: 61
Регистрация: 5-10-05
Из: Зеленоград
Пользователь №: 9 268

|
Цитата(ar__systems @ Apr 17 2009, 14:54)  Это совершенно независимая система. Что имеется ввиду? JTAG заточен под ядро, работает только с ядром и не имеет никакого понятия о периферии. Или Вы думаете, что при проектировании каждого нового чипа с новой периферией весь механизм JTAG переделывают под конкретный чип? Микроконтроллеры - это макросборки из кубиков, один из которых - ядро ARM - отдельное устройство, другое (это отдельная разработка, на которую есть отдельная документация) - VIC, могу как пример указать конкретный datasheet, и так далее. Кстати, это одна из причин, почему возникают spurious interrupts, от которых никак нельзя избавиться в микроконтроллерах LPC2000
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|