zuuuuk
Постоялец
Offline
|
|
« : 23-01-2011 19:03 » |
|
Вопрос для специалистов по микроконтроллерам и не только.
я использую gcc и для отладки gdb. где можно почитать про отладочную информацию, которую помещает компилятор в программу? (gcc -g ..)
|
|
« Последнее редактирование: 23-01-2011 19:42 от Алексей1153++ »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #1 : 23-01-2011 19:33 » |
|
А что именно интересует? Полной информации у меня нет, но какие-то отдельные детали вроде были.
И еще вопрос: для какой цели? Может, эта задача проще решается? Я всегда обходился без этой информации.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
|
« Ответ #2 : 23-01-2011 20:38 » |
|
меня эта тема интересует в чито образовательном плане. какая отладочная информация передается с контроллера в компьютер? с кокой вообще информацией работает дебагер? я буду рад если вы поделитесь хотя бы деталями. потому что у меня возникли проблемы с поиском этой информации.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #3 : 23-01-2011 21:53 » |
|
Вот пока попался на глаза формат исполняемого файла ELF. Там есть формат символьных таблиц. Вот здесь есть обзор DWARF: http://code.google.com/p/deebug/wiki/DwarfIntro . Сам я этими спецификациями не пользовался, поскольку предпочитаю использовать при разработке программ для микроконтроллеров среду модульного тестирования Unity. С ней отладка фактически не нужна. Собственно, я именно поэтому и использую gcc. какая отладочная информация передается с контроллера в компьютер? Вот этот пункт вообще не понял, уточните, пожалуйста.
|
ELF.pdf (231.42 Кб - загружено 1138 раз.)
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
|
« Ответ #4 : 24-01-2011 11:13 » |
|
какая отладочная информация передается с контроллера в компьютер? Вот этот пункт вообще не понял, уточните, пожалуйста. при пошаговой отладки программы на мк. (при эмуляции) данный из платы передаются в компьютер. (точки останова, переменные) вот мне интересно это взаимодействие плата и компьютера. поясни, пожалуйста, что такое "среда модульного тестирования Unity"
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #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
|
|
« Ответ #6 : 24-01-2011 11:50 » |
|
И еще пару слов об отладке МК.
Я работаю с МК семействоа AVR. Для них есть компиляторы C гораздо более высокого качества, чем GCC, например, от IAR. Я выбрал GCC по той причине, что он реализован на массе платформ, в том числе на IBM PC под *nix и Windows. А это значит, что бОльшую часть кода можно безо всяких изменений отладить на компьютере, не загружая его в МК. То же касается и юнит-тестов.
Я в свое время запасся платой Atmel Dragon для отладки через JTAG, но так ни разу ее и не подключил - не было необходимости. Хорошо протестированный код и так работает без проблем.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
|
« Ответ #7 : 24-01-2011 14:57 » |
|
большое спасибо вы очень доходчиво мне все объяснили.
я бы хотел уточнить о unit test. ты создаешь тесты для каждого программного модуля (функции) в микроконтроллере? Т. е. фактически ты создаешь программную модель платы и тестируешь там свой код для микроконтроллера?
|
|
« Последнее редактирование: 24-01-2011 16:14 от zuuuuk »
|
Записан
|
|
|
|
Dale
|
|
« Ответ #8 : 24-01-2011 17:53 » |
|
Идея юнит-тестирования пришла из объектно-ориентированных языков. Сейчас весьма популярно семейство фреймворков xUnit, реализованное на многих языках программирования. Лично я имел дело с JUnit для Java и NUnit для C#.
Юнит-тесты пишутся таким образом, чтобы протестировать интерфейс класса. Тестируется каждый метод, желательно иметь тест для каждого класса эквивалентности входных параметров. Впрочем, об этом сейчас довольно много пишут, литературы хватает с избытком.
Поскольку язык C не относится к объектно-ориентированным, напрямую применить эти методики к нему проблематично. Впрочем, при должном умении и на С вполне можно писать объектно-ориентированные программы, а значит, и юнит-тесты для них.
Хорошие результаты дает тестирование программ для МК на компьютере. На первый взгляд кажется, что это невозможно, ведь в составе МК есть масса периферии (таймеры, АЦП, различные интерфейсы), которых нет на ПК. К тому же при работе с ними используются специфические для МК конструкции языка C. На самом деле проблема решаема при правильном подходе. В программу вводится уровень абстракции от аппаратных средств (HAL, Hardware Abstraction Layer), и все взаимодействие с аппаратурой программа производит через него. Идея HAL не нова, она издавна примняется в мобильных операционных системах. В версии программы для компьютера широко используются объекты-дублеры (заглушки, моки, шпионы и т.д.), позволяющие производить полное тестирование кода. В целевой версии для МК остается лишь реализовать HAL, который компактен и прост.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
zuuuuk
Постоялец
Offline
|
|
« Ответ #9 : 25-01-2011 05:21 » |
|
я прошу прощения что немного сместил тему форума. но тестирование кода для мк моя больная тема. В целом я понял что HAL пишется на комп. и компилируется. в место кода мк вставляются заглушки. Потом mock заменяется настоящим кодом для мк. И что все это компилировать одним компилятором? ведь для мк я буду использовать другой компилятор (iar, winAVR итд) чем для компа.
|
|
|
Записан
|
|
|
|
Dale
|
|
« Ответ #10 : 25-01-2011 06:42 » |
|
я прошу прощения что немного сместил тему форума. но тестирование кода для мк моя больная тема. Эта тема волнует всех, кто хочет производить качественный софт. Ведь на реальных примерах оттестировать программу можно далеко не всегда. К тому же, если тестирование будет требовать применения ручного труда и затрат рабочего времени, его будут стараться проводить пореже, а это значит, что ошибки находить будут в основном пользователи. Если хотите, можно начать новую тему о тестировании встроенных систем. Там тоже есть о чем поговорить. В целом я понял что HAL пишется на комп. и компилируется. в место кода мк вставляются заглушки. Да, в общем правильно. Только не обязательно заглушки. В общем это называется "тестовые дублеры", а заглушки и моки - это их частные случаи. У дублеров есть довольно много разновидностей для разных целей. А вообще стратегия именно такая. Если, например, наш контроллер должен читать ввод с клавишной матрицы и зажигать светодиоды, мы можем вынести в HAL абстрактные функции readKey() и setLightOn (Off). Для МК это будут реальные функции чтения/записи регистров, подавления дребезга и т.п., а для компьютера мы будем читать ввод с клавиатуры и выводить состояние индикаторов на экран. Это позволит нам протестировать логику программы, не загружая ее в МК и даже без симуляции. Потом mock заменяется настоящим кодом для мк. И что все это компилировать одним компилятором? ведь для мк я буду использовать другой компилятор (iar, winAVR итд) чем для компа. Я именно поэтому и выбрал WinAVR, что он является клоном GCC, а значит, бОльшая часть кода будет компилироваться одинаково и для МК, и для компьютера. Не скомпилируется на компьютере только та часть, которая использует особенности МК, т.е. взаимодействует с аппаратурой. Но мы договорились выносить эту часть в HAL, поэтому вся нестандартная часть кода будет локализована, а не раскидана по программе. Именно поэтому я и не выбрал, скажем, IAR, который заточен под МК и дает лучший код и больше удобств - потеряю совместимость. Ну и попутно в перспективе проще будет переходить на другой МК, если возникнет необходимость.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
Dale
|
|
« Ответ #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
|
|
« Ответ #12 : 25-01-2011 07:31 » |
|
А теперь ПИД- регулятор...
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Dale
|
|
« Ответ #13 : 25-01-2011 07:49 » |
|
А теперь ПИД- регулятор... Да в принципе то же самое, только деталей побольше Выносим в HAL входы/выходы, заглушаем чем-нибудь более/менее подходящим для прогона на персоналке, отдельно тщательно жучим численные методы интегрирования-дифференцирования... В общем, повторяем славный путь ребят с самоходными тележками из AtomicObjects, о котором они нам любезно поведали и вдобавок подарили свой набор инструментов.
|
|
|
Записан
|
Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.
Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard
Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
|
|
|
|