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

 
 
 
Reply to this topicStart new topic
> Проблемы с UART под отладкой, Залипает прерывание
b-volkov
сообщение Apr 9 2009, 05:40
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907



Имеем: LPC2148 + IAR + Wigller. Девайс непрерывно обменивается данными с РС через UART. Останавливаем программу кнопкой [Break] или по брекпоинту – без разницы. После остановки данные еще какое-то время продолжают поступать в UART. В регистре UOIIR видно, что имеется отложенное CTI-прерывание, что вполне логично. Если затем продолжить выполнение программы, дав тем самым процу возможность обработать прерывание – все нормально. А во если ее сбросить, то прерывание UART «залипает». После этого идентификатор в UOIIR уже не сбрасывается ни при инициализации UART, ни при обработке прерывания (считывания U0RBR), в результате чего программа постоянно входит в обработчик. Помогает только аппаратный сброс с последующим перезапуском отладчика. Так должно быть или это результат кривого программирования? (во всем остальном UART работает нормально) Почему команда сброса ФИФО во время инициализации не сбрасывает прерывание?
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 9 2009, 05:45
Сообщение #2


Местный
***

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



Цитата(b-volkov @ Apr 9 2009, 09:40) *
А во если ее сбросить, то прерывание UART «залипает».


Перезапустить программу в отладчике? Такого нет. Сбрасывайте все регистры UART и VIC при инициализации.
Go to the top of the page
 
+Quote Post
b-volkov
сообщение Apr 10 2009, 09:44
Сообщение #3


Частый гость
**

Группа: Свой
Сообщений: 137
Регистрация: 10-04-07
Из: г. Троицк
Пользователь №: 26 907



Как нет? А кнопка "Reset"? В смысле, кнопка не на плате, а на панели инструментов отладчика.
А что значит "сбрасывать"? Записывать в них нули? К сожалению, флаг прерывания так не сбрасывается. В VIC, на сколько я понял, предусмотрена очистка только софтовых прерываний и сброс регистра разрешения прерываний. В UART есть только команда сброса ФИФО, я ее даю - не помогает. Если я не прав - просветите.
Go to the top of the page
 
+Quote Post
meister
сообщение Apr 10 2009, 09:51
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 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;
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Apr 17 2009, 09:05
Сообщение #5


Участник
*

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



Здравствуйте.

Во-первых, при остановке по брейкпоинту или ещё как программисты любят наблюдать вкладки периферии и Watch. Я тоже. Не не забывайте, что содержимое этой вкладки, которую вам показывает дебаггер после бряка, он (дебаггер) достаёт через JTAG. Это значит, что он заставляет ядро процессора лезть и перечитывать всю периферию, которая отображается в отладчике, включая панель Watch. Как вы думаете, что будет, если процессор покажет вам состояние, скажем, регистра чтения FIFO, или VICVectAddr? В первом случае ваша программа после продолжения выполнения может эти данные уже не прочитать. Во втором случае ситуация может оказаться ещё интереснее: внутренняя логика VIC управляется чтением и записью будет переключена чтением этого регистра, что должно быть сделано в прерывании, и чтобы сбросить логику, нужно опять же выполнить запись в этот регистр, что должно быть сделано в последних инструкциях обработчика.

Отсюда вывод: при остановке в прерывании у вас НЕ ДОЛЖНЫ ОТОБРАЖАТЬСЯ в отладчике как либо любые регистры, чтение которых меняет логику работы периферии.

Сообщение отредактировал IgorMarx - Apr 17 2009, 09:05
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Apr 17 2009, 10:54
Сообщение #6


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



Цитата(IgorMarx @ Apr 17 2009, 04:05) *
Здравствуйте.

Во-первых, при остановке по брейкпоинту или ещё как программисты любят наблюдать вкладки периферии и Watch. Я тоже. Не не забывайте, что содержимое этой вкладки, которую вам показывает дебаггер после бряка, он (дебаггер) достаёт через JTAG. Это значит, что он заставляет ядро процессора лезть и перечитывать всю периферию, которая отображается в отладчике, включая панель Watch. Как вы думаете, что будет, если процессор покажет вам состояние, скажем, регистра чтения FIFO, или VICVectAddr? В первом случае ваша программа после продолжения выполнения может эти данные уже не прочитать. Во втором случае ситуация может оказаться ещё интереснее: внутренняя логика VIC управляется чтением и записью будет переключена чтением этого регистра, что должно быть сделано в прерывании, и чтобы сбросить логику, нужно опять же выполнить запись в этот регистр, что должно быть сделано в последних инструкциях обработчика.

Отсюда вывод: при остановке в прерывании у вас НЕ ДОЛЖНЫ ОТОБРАЖАТЬСЯ в отладчике как либо любые регистры, чтение которых меняет логику работы периферии.
Это не верно, по крайней мере в общем случае. Если это так для ЛПЦ, то это очень странно. Механизм JTAG не использует никакие функции ядра. Это соверщенно независимая система. О том что какой-то регистр бы прочитан через JTAG, ядро узнать никак не может.

Другое дело что если вы пишете в регистр который управляется записью или чтением, то опять таки это не тоже самое, как если бы ядро его записало. В этом случае возможны как раз серьезные глюки, в зависимости от того, как устроен процессор. Что вы и наблюдаете. Кстати, а зачем было подвергать прогрмамму такому издевательству -- сбрасывать прерывание?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 17 2009, 11:07
Сообщение #7


Гуру
******

Группа: Модераторы
Сообщений: 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)
Go to the top of the page
 
+Quote Post
Wano
сообщение Apr 17 2009, 13:26
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 272
Регистрация: 3-06-06
Пользователь №: 17 737



Цитата(Сергей Борщ @ Apr 17 2009, 14:07) *
В данном случае вы не правы. В правоте IgorMarx легко убедиться, запустив отладчик.


Поддерживаю. Проблема была обратная, смотришь периферию SPI отладчиком - байт уходит. Запускаешь прогу без отладки - не пашет. Отсель мораль, надо очищать регистр SPI состояния чтением перед каждой передачей.
Go to the top of the page
 
+Quote Post
IgorMarx
сообщение Apr 17 2009, 16:20
Сообщение #9


Участник
*

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



Цитата(ar__systems @ Apr 17 2009, 14:54) *
Это совершенно независимая система.


Что имеется ввиду? JTAG заточен под ядро, работает только с ядром и не имеет никакого понятия о периферии. Или Вы думаете, что при проектировании каждого нового чипа с новой периферией весь механизм JTAG переделывают под конкретный чип?

Микроконтроллеры - это макросборки из кубиков, один из которых - ядро ARM - отдельное устройство, другое (это отдельная разработка, на которую есть отдельная документация) - VIC, могу как пример указать конкретный datasheet, и так далее. Кстати, это одна из причин, почему возникают spurious interrupts, от которых никак нельзя избавиться в микроконтроллерах LPC2000
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st June 2025 - 09:55
Рейтинг@Mail.ru


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