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

 
 
> Простой и прозрачный способ отладки программ, (особенно для начинающих)
=GM=
сообщение Dec 11 2007, 15:32
Сообщение #1


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Время от времени слышатся просьбы о помощи в отладке программы. Ниже предлагается простой способ отладки через уарт путём внесения отладочной информации в отлаживаемую программу, т.е. по мере необходимости в исследуемые ветви отлаживаемого кода вставляются две строчки с определённым текстом, например, таким
Код
         rcall     debug
         .db       "some datum to be sent",0

или таким
Код
         rcall     debug
         .db       "первая точка пройдена",0


Программа вывода отладочной информации имеет следующий вид
Код
debug:   pop       zh
         pop       zl
         lsl       zl
         rol       zh
deb1:    lpm       temp,z+
         tst       temp
         brne      deb2
         lsr       zh
         ror       zl
         ijmp
deb2:    sbis      ucsr0a,udre0
         rjmp      deb2
         out       udr0,temp
         rjmp      deb1

и занимает всего 14 слов кода.

Интересно бы пообсуждать данный метод и узнать заодно, кто-нибудь пользуется подобным способом отладки?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
rx3apf
сообщение Dec 11 2007, 15:53
Сообщение #2


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(=GM= @ Dec 11 2007, 18:32) *
Интересно бы пообсуждать данный метод и узнать заодно, кто-нибудь пользуется подобным способом отладки?

Я, например, только таким способом и пользуюсь wink.gif

Приведенный фрагмент компактен и симпатичен, но не обеспечивает сохранение регистров, да и UART UARTу рознь, так что предпочитаю все сохранить, пусть даже код существенно более раздутый получается, и воспользоваться "полноценной" программой передачи (которая используется и другими компонентами). Плюс к отладочной пропечатке по точкам практически всегда использую hex-пропечатку того, чего надо, на уровне байтов, регистров, а то и блока данных в формате hex/ascii.

Приведенный пример с вызовом и параметрами в виде констант вслед за ним еще очень удобен при систематической загрузке регистров какой-нибудь периферии или собственных аккумуляторов или еще чего, не надо кучи ldi и lpm, результат компактнее и нагляднее (и пусть в меня не бросают камнями апологеты ЯВУ).

А еще для отладки оказалось весьма удобным использовать бутер, который принимает через UART непосредственно .hex, и перепрограммирует программную память прямо в терминале, по простому копированию. Но тут надо использовать либо xon/xoff, либо (что особенно удобно в случае USB/COM) аппаратное управление потоком. 921600 и "со свистом"... Заодно упрощается жизнь на ноутбуках, где кроме USB и нет ничего. Один раз бутер хоть чем зашить и все... Но, понятное дело, это для более-менее "объемистых" камешков, хоть восьмая мега нужна...
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 11 2007, 16:36
Сообщение #3


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(rx3apf @ Dec 11 2007, 15:53) *
Приведенный фрагмент компактен и симпатичен, но не обеспечивает сохранение регистров, да и UART UARTу рознь, так что предпочитаю все сохранить, пусть даже код существенно более раздутый получается, и воспользоваться "полноценной" программой передачи (которая используется и другими компонентами)

Код можете показать? Интересует как вы сохраняете регистры, и где.

Что касается "полноценной" программы передачи, то тут вопрос, к примеру, вот вы начинающий и как раз хотите освоить приём-передачу "полноценной" программы с кольцевыми буферами и т.п. Что-то не срастается, глаз замылился, вы не видите очевидных вещей...значит, самое время воспользоваться более-менее автономным механизмом отладки.
Цитата(rx3apf @ Dec 11 2007, 15:53) *
Плюс к отладочной пропечатке по точкам практически всегда использую hex-пропечатку того, чего надо, на уровне байтов, регистров, а то и блока данных в формате hex/ascii
Тут как-то не врубился, что это - hex-пропечатка?
Цитата(rx3apf @ Dec 11 2007, 15:53) *
Приведенный пример с вызовом и параметрами в виде констант вслед за ним еще очень удобен при систематической загрузке регистров какой-нибудь периферии или собственных аккумуляторов или еще чего, не надо кучи ldi и lpm, результат компактнее и нагляднее (и пусть в меня не бросают камнями апологеты ЯВУ)

Это должен был бы быть мой следующий пост(:-(. Похоже, не один я такой прыткий...Покажите кусочек кода, если можно.
Цитата(rx3apf @ Dec 11 2007, 15:53) *
А еще для отладки оказалось весьма удобным использовать бутер, который принимает через UART непосредственно .hex, и перепрограммирует программную память прямо в терминале, по простому копированию. Но тут надо использовать либо xon/xoff, либо (что особенно удобно в случае USB/COM) аппаратное управление потоком. 921600 и "со свистом"...
А смысл 921600, если пишется 5 мс? Насчёт загрузчика я пока думаю, не решил до конца вопрос. Заманчиво использовать тот-же усап, в принципе, можно всю рам задействовать, но вот что делать, если программа больше объёма рамы?


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Dec 11 2007, 16:54
Сообщение #4


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(=GM= @ Dec 11 2007, 19:36) *
Код можете показать? Интересует как вы сохраняете регистры, и где.

Не претендуя на оптимальность и компактность:

;----------------------------------------------------------------------
; Программа выдачи сообщений
; Текст сообщения описывается директивами .db непосредственно после
; команды rcall Msg, признаком конца текста является байт 00.
; После выполнения программы управление возвращается на следующую за
; байтом 00 команду. Программа не портит регистры. Для выдачи текста
; используется команда rcall Print.
; Эта версия программы может использоваться только для микроконтроллеров
; с 16-разрядным счетчиком PC !!!
;----------------------------------------------------------------------

Msg:
push temp
push YH ; сохраним
push YL ; рабочие
push ZH ; регистры
push ZL
in YH,SPH ; адрес текущей
in YL,SPL ; позиции стека
ldd ZH,Y+6
ldd ZL,Y+7 ; адрес операнда в памяти
lsl ZL ; адрес для команды lpm
rol ZH
Msg1:
lpm temp,Z+ ; очередной байт
tst temp ; контроль на терминатор
breq Msg2 ; текст закончился
rcall Print ; вывод байта
rjmp Msg1
Msg2:
sbrc ZL,0
adiw ZL,1 ; коррекция для нечетного адреса
lsr ZH ; новый адрес возврата
ror ZL
std Y+6,ZH
std Y+7,ZL ; меняем адрес в стеке
pop ZL
pop ZH
pop YL
pop YH
pop temp
ret


Цитата(=GM= @ Dec 11 2007, 19:36) *
Что касается "полноценной" программы передачи, то тут вопрос, к примеру, вот вы начинающий и как раз хотите освоить приём-передачу "полноценной" программы с кольцевыми буферами и т.п. Что-то не срастается, глаз замылился, вы не видите очевидных вещей...значит, самое время воспользоваться более-менее автономным механизмом отладки.

Но передачу-то в первую очередь надо отладить, потому как мало пихать байты в UDR, надо ведь и делители настроить, да и готовность приемника (в случае управления потоком) проверить. Для передачи часто можно и без кольцевых буферов обойтись.

Цитата(=GM= @ Dec 11 2007, 19:36) *
Тут как-то не врубился, что это - hex-пропечатка?

В смысле, вывести на экран hex-значение байта.
Цитата(=GM= @ Dec 11 2007, 19:36) *
А смысл 921600, если пишется 5 мс?

Меньше накладные расходы на пересылку. И 5 mS это ведь страница пишется. 64 байта даже в бинарном виде на 115200 передаются столько же, в .hex вдвое дольше. А страницы-то бывают и 128 (лениво смотреть, в старших камнях ведь и того больше, наверное ?) 12 кило кода в mega168 сейчас загружаются две секунды...
Цитата(=GM= @ Dec 11 2007, 19:36) *
Насчёт загрузчика я пока думаю, не решил до конца вопрос. Заманчиво использовать тот-же усап, в принципе, можно всю рам задействовать, но вот что делать, если программа больше объёма рамы?

А при чем тут объем RAM ? Ну да, если не управлять потоком, то да, надо проглотить все сразу. Но ведь можно и тормознуть (я останавливаюсь после каждой строчки, т.е. нужен буфер на строку).
Go to the top of the page
 
+Quote Post
=GM=
сообщение Dec 12 2007, 16:48
Сообщение #5


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



To rx3apf Посмотрел ваш код, неплохо написано, все используемые регистры сохраняются, только немного тяжеловесно из-за этого. А вот эти две инструкции
Цитата(rx3apf @ Dec 11 2007, 16:54) *
Код
msg2:   sbrc    ZL,0
        adiw    ZL,1   ; коррекция для нечетного адреса

по большому счёту не нужны, поскольку при чётном числе байт asciz-строки делать ничего не нужно, а при нечётном числе байт в последнем слове asciz-строки будет 0х0000, а это код команды nop. Поэтому в моём варианте и нет коррекции нечётного адреса.

Ещё одно соображение по поводу сохранения регистров. Мне кажется, в фоне должны быть доступны все регистры регистрового файла. Тут главное не дойти до абсурда, например сохранить два регистра, участвующих в сложении, сохранить результат, а затем восстановить оба регистра. Возможно, выбран не самый удачный пример, но смысл наглядно видно. Само собой разумеется, что многое зависит от задачи.


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 13 2007, 09:59
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



А зачем так долбаться, если можно тупо поставить брякпойнт и, тормознувшись, посмотреть содержимое кишечника впрямую, а не через замочную скажину.
Скажу прямо, я тоже отлаживался через терминалки. Но через ЖТАХ-дебугвирь как-то прямее. ИМХО.
Go to the top of the page
 
+Quote Post
rx3apf
сообщение Dec 13 2007, 10:49
Сообщение #7


Гуру
******

Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047



Цитата(mse @ Dec 13 2007, 12:59) *
А зачем так долбаться, если можно тупо поставить брякпойнт и, тормознувшись, посмотреть содержимое кишечника впрямую, а не через замочную скажину.
Скажу прямо, я тоже отлаживался через терминалки. Но через ЖТАХ-дебугвирь как-то прямее. ИМХО.

Часто нужна натуральная "реалтаймовость". Для реализации которой сохраненная трасса удобнее. Пропечатка на терминале по ходу дела может помешать, а breakpoint - убить идею на корню.
Go to the top of the page
 
+Quote Post
mse
сообщение Dec 13 2007, 11:56
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 709
Регистрация: 3-05-05
Пользователь №: 4 693



Цитата(rx3apf @ Dec 13 2007, 13:49) *
Часто нужна натуральная "реалтаймовость". Для реализации которой сохраненная трасса удобнее. Пропечатка на терминале по ходу дела может помешать, а breakpoint - убить идею на корню.

Случаи, конечно, разные бывают, но на моё ИМХО, сброс строки о 20-30 символов и рилтайм...Хотя по 115200, да если РАМы для "трассы" нет...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- =GM=   Простой и прозрачный способ отладки программ   Dec 11 2007, 15:32
|- - =GM=   Цитата(mse @ Dec 13 2007, 09:59) А зачем ...   Dec 13 2007, 13:00
- - Dog Pawlowa   Цитата(=GM= @ Dec 11 2007, 19:32) ... Инт...   Dec 11 2007, 16:44
|- - =GM=   Цитата(Dog Pawlowa @ Dec 11 2007, 16:44) ...   Dec 11 2007, 16:51
|- - Dog Pawlowa   Цитата(=GM= @ Dec 11 2007, 20:51) Что вы ...   Dec 12 2007, 07:59
- - slog   Это аналог printf() в Си   Dec 11 2007, 17:42
- - zhevak   Странные вы какие-то... Отладка отладке -- рознь....   Dec 11 2007, 20:12
- - bodja74   Цитата(=GM= @ Dec 11 2007, 19:32) ijmp de...   Dec 11 2007, 20:49
- - sla000   ИМХО вывод длинных строк для отладки - непозволите...   Dec 12 2007, 04:39
|- - rx3apf   Цитата(sla000 @ Dec 12 2007, 07:39) ИМХО ...   Dec 12 2007, 12:59
|- - Maik-vs   Вставлю и свои 5 коп Тоже uart, но с прерываниям...   Dec 12 2007, 13:27
- - IGK   Я тоже УАРТом отлаживаюсь. Вывод в фоновой програм...   Dec 12 2007, 06:46
- - adc   Подскажите пожалуйста что я делаю не так? в свою ...   Dec 12 2007, 06:52
|- - ae_   Цитата(adc @ Dec 12 2007, 15:52) Подскажи...   Dec 12 2007, 08:03
- - adc   ae_ пасиба! Я писал что "..в свою прогр...   Dec 12 2007, 08:45
|- - =GM=   Цитата(adc @ Dec 12 2007, 08:45) Странно,...   Dec 12 2007, 10:53
- - Aesthete Animus   Хм... Я тоже использую вывод отладочной информации...   Dec 14 2007, 08:28
- - _Pasha   Забыли упомянуть о еще одном извращенном туле: глу...   Dec 14 2007, 09:08
|- - =GM=   Цитата(_Pasha @ Dec 14 2007, 09:08) Забыл...   Dec 14 2007, 13:51
- - _Pasha   Цитата(=GM= @ Dec 14 2007, 16:51) Если я ...   Dec 14 2007, 15:04
|- - =GM=   Цитата(_Pasha @ Dec 14 2007, 15:04) Пошаг...   Dec 14 2007, 20:32
|- - _Pasha   Цитата(=GM= @ Dec 14 2007, 23:32) А что в...   Dec 15 2007, 09:12
- - SergeyYA   Я отлаживаю так проги 1 в разных функциях с помощь...   Dec 16 2007, 09:32


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

 


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


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