Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Кто-нибудь пользуется avr-c++ и отладчиком?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Непомнящий Евгений
Я пытался использовать avr-c++ и avrstudio (компилирую с ключом -g2, в студии открываю elf). Студия 4.18 b716

напоролся на следующее:
1. Наследование
Код
struct A { int a; };
struct B : A { int b; } bb;

В переменной bb не виден член "а". Для меня это критично
2. Не видны глобальные переменные из пространств имен. В принципе можно обойтись
3. Члены структур типа bool не видны - ошибка "Неизвестный тип". Тоже можно обойтись. Хотя неприятно...

Попробовал сделать cof из elf. Студия его открывает, но сразу сваливается в окно ассемблера, не дает поставить точку останова на сишном тексте программы (хотя список сишных файлов показывает).

Avarice судя по вот этому http://www.avrfreaks.net/index.php?name=PN...pic&t=97934 не умеет работать с xmega. К сожалению, я нарыл это только после того, как все настроил и увидел, что брекпоинты не ставятся sm.gif

Как вы отлаживаете с++ код? Может есть еще какие-нибудь флаги компиляции или линковки для большей дружбы со студией?
demiurg_spb
Цитата(Непомнящий Евгений @ Jun 1 2011, 10:53) *
Как вы отлаживаете с++ код?
Также как и Си-код - через консоль.
Непомнящий Евгений
Цитата(demiurg_spb @ Jun 1 2011, 13:34) *
Также как и Си-код - через консоль.


Консоль и осциллограф, а также отладка на PC конечно рулят, но аппаратный отладчик часто весьма удобен.
demiurg_spb
Ничего удобнее консоли не встречал.
Непомнящий Евгений
Цитата(demiurg_spb @ Jun 1 2011, 13:40) *
Ничего удобнее консоли не встречал.


А как вы ее готовите? Вот например, есть у меня много глобальных данных и я хочу их посмотреть.

Делать форматирование на стороне прошивки как-то не охота.

Кидать дамп памяти, а потом на ПС восстанавливать структуру?
demiurg_spb
Много обычно смотреть не требуется. Смотрю обычно максимум 3-5 штук.
Подходы могут быть совершенно разные.
Можно форматировать дамп в таргете и прямо в терминале смотреть.
Непомнящий Евгений
Цитата(demiurg_spb @ Jun 1 2011, 14:39) *
Много обычно смотреть не требуется. Смотрю обычно максимум 3-5 штук.
Подходы могут быть совершенно разные.
Можно форматировать дамп в таргете и прямо в терминале смотреть.


ИМХО, неудобно. Сегодня нужен один комплект переменных, завтра второй, а послезавтра снова первый. Т.е. в коде остаются закомментированные/задефайненные куски по выводу переменных. Эти куски постепенно устаревают, их надо или обновлять или выкидывать.

Есть несколько дурацкая мысль потратить неделю и сделать на ПС анализатор, который, сопоставляя дамп куска памяти и отладочную информацию из elf-файла, выдает дерево переменных. Такая штука была бы очень полезна и при наличии отладчика - например можно получить дамп памяти залоченного девайса у клиента.

При этом девайс надо всего лишь научить по запросу выплевывать дамп заданного куска ОЗУ.
demiurg_spb
Цитата(Непомнящий Евгений @ Jun 3 2011, 10:22) *
ИМХО, неудобно. Сегодня нужен один комплект переменных, завтра второй, а послезавтра снова первый. Т.е. в коде остаются закомментированные/задефайненные куски по выводу переменных. Эти куски постепенно устаревают, их надо или обновлять или выкидывать.

Написать
Код
dprint(var);
Ничуть не дольше чем добавить переменную в отладчике.
Более того значение переменной ты будешь видеть всегда адекватное (именно в этой точке программы), даже при работе в реалтайме.
Обычно интересуют значения конкретных переменных в конкретных точках программы, а не вся жизнь переменной (тем более регистровой).
Цитата
...сопоставляя дамп...
А что у Вас за специфика, что нужен дамп памяти? Вы собственную многопоточную ость дебажите?
_Pasha
Цитата(Непомнящий Евгений @ Jun 3 2011, 09:22) *
Такая штука была бы очень полезна и при наличии отладчика - например можно получить дамп памяти залоченного девайса у клиента.

При этом девайс надо всего лишь научить по запросу выплевывать дамп заданного куска ОЗУ.


Мысль интересная. Вставлю 5 коп, как я бы сделал без отладчика.
Я б повесил кусок кода, обслуживающий формирование брекпоинта, на прерывание типа UDRE - чтобы флаг прерывания вставал всегда после выхода из процедуры обработки. Таким образом, уронив производительность раз в 16, можно ставить точки останова в залоченном девайсе.
dxp
Цитата(demiurg_spb @ Jun 6 2011, 11:39) *
Написать
Код
dprint(var);
Ничуть не дольше чем добавить переменную в отладчике.
Не дольше, да. Но только нужно пересобирать программу. Каждый раз, когда хочется увидеть переменную, которой ещё нет в печати.

Цитата(demiurg_spb @ Jun 6 2011, 11:39) *
Более того значение переменной ты будешь видеть всегда адекватное (именно в этой точке программы), даже при работе в реалтайме.

Это так. Но иногда рулит метод отладки, когда останавливаешься в каком-то месте программы по брейкпоинту и аккуратно по шагам идёшь и смотришь, что там происходит, отслеживая значения переменных, имеющих отношение к данному фрагменту программы - вот тут их удобно вытащить на watch окошко.

Резюмируя: ни один из способов (через отладчик или через печать) не является безоговорочно лучшим. Оба они хороши в разных ситуациях, и лучше иметь их в арсенале оба.
demiurg_spb
Согласен.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.