zuuuuk
Постоялец
Offline
|
![](/Themes/VU3/images/post/xx.gif) |
« : 23-01-2011 19:03 » |
|
Вопрос для специалистов по микроконтроллерам и не только.
я использую gcc и для отладки gdb. где можно почитать про отладочную информацию, которую помещает компилятор в программу? (gcc -g ..)
|
|
« Последнее редактирование: 23-01-2011 19:42 от Алексей1153++ »
|
Записан
|
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #1 : 23-01-2011 19:33 » |
|
А что именно интересует? Полной информации у меня нет, но какие-то отдельные детали вроде были.
И еще вопрос: для какой цели? Может, эта задача проще решается? Я всегда обходился без этой информации.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #2 : 23-01-2011 20:38 » |
|
меня эта тема интересует в чито образовательном плане. какая отладочная информация передается с контроллера в компьютер? с кокой вообще информацией работает дебагер? я буду рад если вы поделитесь хотя бы деталями. потому что у меня возникли проблемы с поиском этой информации.
|
|
|
Записан
|
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #3 : 23-01-2011 21:53 » |
|
Вот пока попался на глаза формат исполняемого файла ELF. Там есть формат символьных таблиц. Вот здесь есть обзор DWARF: http://code.google.com/p/deebug/wiki/DwarfIntro . Сам я этими спецификациями не пользовался, поскольку предпочитаю использовать при разработке программ для микроконтроллеров среду модульного тестирования Unity. С ней отладка фактически не нужна. Собственно, я именно поэтому и использую gcc. какая отладочная информация передается с контроллера в компьютер? Вот этот пункт вообще не понял, уточните, пожалуйста.
|
ELF.pdf (231.42 Кб - загружено 1151 раз.)
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #4 : 24-01-2011 11:13 » |
|
какая отладочная информация передается с контроллера в компьютер? Вот этот пункт вообще не понял, уточните, пожалуйста. при пошаговой отладки программы на мк. (при эмуляции) данный из платы передаются в компьютер. (точки останова, переменные) вот мне интересно это взаимодействие плата и компьютера. поясни, пожалуйста, что такое "среда модульного тестирования Unity"
|
|
|
Записан
|
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #5 : 24-01-2011 11:32 » |
|
при пошаговой отладки программы на мк. (при эмуляции) данный из платы передаются в компьютер. (точки останова, переменные) вот мне интересно это взаимодействие плата и компьютера. Имеется в виду отладка при помощи JTAG и подобных интерфейсов? Дело в том, что контроллер не понимает C. Пошаговая отладка ведется на двоичном уровне. Компьютер задает адрес точки останова, соответствующий оператору C, и передает эти данные эмулятору. Контроллер останавливается в этой точке, и эмулятор затем передает в компьютер состояние регистров, ячеек памяти и т.п. Отладчик на компьютере показывает эти данные в виде переменных/регистров МК. Похоже, вас интересует протокол JTAG? Именно по этому протоколу идет обмен данными между компьютером и МК, но там нет никакой отладочной информации, порожденной компилятором. Вся эта информация остается на компьютере. поясни, пожалуйста, что такое "среда модульного тестирования Unity" Это довольно большая тема. Если в двух словах: есть такое течение в современной программной инженерии, которое утверждает, что программный код, не подвергшийся тестированию, не может рассматриваться как качественный. Для тестирования отдельных программных модулей применяется модульное (юнит-) тестирование. Наилучшие результаты такой подход дает, если тесты пишутся раньше, чем код. Однако для микроконтроллеров с этим не все так просто. Я когда-то пришел на форум именно с этим вопросом. Попробуйте почитать пару моих переводов: https://club.shelek.ru/viewart.php?id=335 и https://club.shelek.ru/viewart.php?id=337 . Я именно с них начал разбираться в этой проблеме. Если возникнут вопросы, обсудим дальше.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #6 : 24-01-2011 11:50 » |
|
И еще пару слов об отладке МК.
Я работаю с МК семействоа AVR. Для них есть компиляторы C гораздо более высокого качества, чем GCC, например, от IAR. Я выбрал GCC по той причине, что он реализован на массе платформ, в том числе на IBM PC под *nix и Windows. А это значит, что бОльшую часть кода можно безо всяких изменений отладить на компьютере, не загружая его в МК. То же касается и юнит-тестов.
Я в свое время запасся платой Atmel Dragon для отладки через JTAG, но так ни разу ее и не подключил - не было необходимости. Хорошо протестированный код и так работает без проблем.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #7 : 24-01-2011 14:57 » |
|
большое спасибо вы очень доходчиво мне все объяснили.
я бы хотел уточнить о unit test. ты создаешь тесты для каждого программного модуля (функции) в микроконтроллере? Т. е. фактически ты создаешь программную модель платы и тестируешь там свой код для микроконтроллера?
|
|
« Последнее редактирование: 24-01-2011 16:14 от zuuuuk »
|
Записан
|
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #8 : 24-01-2011 17:53 » |
|
Идея юнит-тестирования пришла из объектно-ориентированных языков. Сейчас весьма популярно семейство фреймворков xUnit, реализованное на многих языках программирования. Лично я имел дело с JUnit для Java и NUnit для C#.
Юнит-тесты пишутся таким образом, чтобы протестировать интерфейс класса. Тестируется каждый метод, желательно иметь тест для каждого класса эквивалентности входных параметров. Впрочем, об этом сейчас довольно много пишут, литературы хватает с избытком.
Поскольку язык C не относится к объектно-ориентированным, напрямую применить эти методики к нему проблематично. Впрочем, при должном умении и на С вполне можно писать объектно-ориентированные программы, а значит, и юнит-тесты для них.
Хорошие результаты дает тестирование программ для МК на компьютере. На первый взгляд кажется, что это невозможно, ведь в составе МК есть масса периферии (таймеры, АЦП, различные интерфейсы), которых нет на ПК. К тому же при работе с ними используются специфические для МК конструкции языка C. На самом деле проблема решаема при правильном подходе. В программу вводится уровень абстракции от аппаратных средств (HAL, Hardware Abstraction Layer), и все взаимодействие с аппаратурой программа производит через него. Идея HAL не нова, она издавна примняется в мобильных операционных системах. В версии программы для компьютера широко используются объекты-дублеры (заглушки, моки, шпионы и т.д.), позволяющие производить полное тестирование кода. В целевой версии для МК остается лишь реализовать HAL, который компактен и прост.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #9 : 25-01-2011 05:21 » |
|
я прошу прощения что немного сместил тему форума. но тестирование кода для мк моя больная тема. ![Улыбаюсь](/Smileys/test/smile.gif) В целом я понял что HAL пишется на комп. и компилируется. в место кода мк вставляются заглушки. Потом mock заменяется настоящим кодом для мк. И что все это компилировать одним компилятором? ведь для мк я буду использовать другой компилятор (iar, winAVR итд) чем для компа.
|
|
|
Записан
|
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #10 : 25-01-2011 06:42 » |
|
я прошу прощения что немного сместил тему форума. но тестирование кода для мк моя больная тема. ![Улыбаюсь](/Smileys/test/smile.gif) Эта тема волнует всех, кто хочет производить качественный софт. Ведь на реальных примерах оттестировать программу можно далеко не всегда. К тому же, если тестирование будет требовать применения ручного труда и затрат рабочего времени, его будут стараться проводить пореже, а это значит, что ошибки находить будут в основном пользователи. Если хотите, можно начать новую тему о тестировании встроенных систем. Там тоже есть о чем поговорить. В целом я понял что HAL пишется на комп. и компилируется. в место кода мк вставляются заглушки. Да, в общем правильно. Только не обязательно заглушки. В общем это называется "тестовые дублеры", а заглушки и моки - это их частные случаи. У дублеров есть довольно много разновидностей для разных целей. А вообще стратегия именно такая. Если, например, наш контроллер должен читать ввод с клавишной матрицы и зажигать светодиоды, мы можем вынести в HAL абстрактные функции readKey() и setLightOn (Off). Для МК это будут реальные функции чтения/записи регистров, подавления дребезга и т.п., а для компьютера мы будем читать ввод с клавиатуры и выводить состояние индикаторов на экран. Это позволит нам протестировать логику программы, не загружая ее в МК и даже без симуляции. Потом mock заменяется настоящим кодом для мк. И что все это компилировать одним компилятором? ведь для мк я буду использовать другой компилятор (iar, winAVR итд) чем для компа. Я именно поэтому и выбрал WinAVR, что он является клоном GCC, а значит, бОльшая часть кода будет компилироваться одинаково и для МК, и для компьютера. Не скомпилируется на компьютере только та часть, которая использует особенности МК, т.е. взаимодействует с аппаратурой. Но мы договорились выносить эту часть в HAL, поэтому вся нестандартная часть кода будет локализована, а не раскидана по программе. Именно поэтому я и не выбрал, скажем, IAR, который заточен под МК и дает лучший код и больше удобств - потеряю совместимость. Ну и попутно в перспективе проще будет переходить на другой МК, если возникнет необходимость.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #11 : 25-01-2011 07:10 » |
|
Вот пример. Предположим, нам нужна простейшая программа, которая зажигает светодиод, когда мы нажимаем кнопку, и гасит его, когда мы отпускаем ее. Протестируем по всем правилам. Сначала проектируем абстрактный интерфейс с оборудованием (как часть HAL) (примеры набраны наспех и не проверялись компиляwbtq, причем работа с консолью взята из MS VC++, поэтому совместимость с библиотекой GCC не гарантирую, просто показываю сам принцип): // iodriver.h
extern unsigned char readKey(void); extern void setLightOn(void); extern void setLightOn(void); Затем реализуем заглушку для прогона на компьютере: // iodriverStub.c
#include "iodriver.h" #include <conio.h> #include <stdio.h>
unsigned char readKey(void) { if (!_kbhit) return 0; return (unsigned char)_getch(); }
void setLightOn(void) { printf("Light is on\n"); }
void setLightOff(void) { printf("Light is off\n"); } Теперь основная программа: // main.c
#include "iodriver.h" ... void main (void) { ... for (;;) { if (readkey()) setLightOn(); else setLightOff(); } } Компонуем main.o с iodriverStub.o, запускаем, наслаждаемся. Затем реализуем iodriver.c, в котором собрана вся работа с оборудованием, и компилируем версию для МК. Заметьте, что большинство исходных файлов не меняется, включая заголовок iodriver.h, а они уже оттестированы на компьютере. Конечно, на самом деле это не тестирование, а скорее простенькая демонстрация выполнения программы для МК на компьютере. Тестирование - это отдельная глубокая тема. Здесь я лишь постарался показать на примере, как можно написать программу для МК так, чтобы ее можно было выполнить на компьютере с минимальными переделками кода.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Sla
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #12 : 25-01-2011 07:31 » |
|
![Улыбаюсь](/Smileys/test/smile.gif) А теперь ПИД- регулятор...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
![](/Themes/VU3/images/post/xx.gif) |
« Ответ #13 : 25-01-2011 07:49 » |
|
![Улыбаюсь](/Smileys/test/smile.gif) А теперь ПИД- регулятор... Да в принципе то же самое, только деталей побольше ![Улыбаюсь](/Smileys/test/smile.gif) Выносим в HAL входы/выходы, заглушаем чем-нибудь более/менее подходящим для прогона на персоналке, отдельно тщательно жучим численные методы интегрирования-дифференцирования... В общем, повторяем славный путь ребят с самоходными тележками из AtomicObjects, о котором они нам любезно поведали и вдобавок подарили свой набор инструментов.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
|