UniBomb 0 28 сентября, 2009 Опубликовано 28 сентября, 2009 · Жалоба Добрый день. Не знал куда запостить тему, посему пусть тут повисит. Итак, во время очередной затяжной отладки программы я понял что чего-то мне не хватает в этой жизни для полного счастия. Я понял, что считать быстродействие функций по тактам это зло. Я понял, что следить за переменными ставя точки останова по всей программе это от лукавого. Я понял, что отлавливать вхождения одних функций в другие по загоранию светодиода это тоже не очень хорошо. И я в конце концов пришёл к выводу, что мне нужен хороший профайлер. Единственное что я пока обнаружил - это avr-gprof.exe тихо спящим в папке bin моего WinAVR. Вот пока копаю в эту сторону и что-то оно меня пока не впечатляет. Посему вопрос знатокам - а есть ли в природе альтернативы этому чуду? Что бы мог указать зависимость вызовов функций, что бы мог указать время выполнения каждого куска кода, что бы мог сказать где и как переменные используются, что и зачем храниться в стеке и т.д. И при всём при этом что бы он имел хоть какой-нибудь графический интерфейс... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 28 сентября, 2009 Опубликовано 28 сентября, 2009 · Жалоба Порой создаётся ощущение, что когда люди задают вопрос, то предварительно не осмысливают его. Это не в обиду. Представьте себе, что вам поставили такую задачу. Сделать такое вот програмное средство. Попробуйте осмыслить эту задачу и прикинуть реализацию. Я думаю что вы поймёте, что для выполнения даже части из поставленных вами задач, придётся внести спец участки прямо в код вашей программы (то есть в МК). Более того, эти части должны где-то собирать данные и как-то передавать инфу в головную программу. При этом желательно чтобы они не занимали место во флэш (например ваш код составляет 90% от макс. объёма), не занимали место в памяти (то же) и не влияли на производительность МК (иначе вы не получите объективного результата). Кроме того, они должны вмешиваться в вашу прогу и, в тоже время, не должны влиять на её работоспособность. Прикинули задачку? А теперь реализуем её для мега48 к примеру? Существуют для крупных камней спец аппаратные приблуды типа AVR ONE со стоимостью ~ 1000$. Вроде там такое частично реализовано аппаратным способом. ============== С другой стороны, ничего из вами перечисленного, я, практически, не применяю. Прогрес идёт вперёд. Камень закладывается со значительным запасом (благо разница в цене несущественна и явно выглядит убедительней "затяжной отладки"). Фраза "... отлавливать вхождения одних функций в другие по загоранию светодиода ..." у меня вызывает изумление. Может поясните, на конкретном примере, а мы попробуем вам предложить альтернативу. Все же отлаживают в конце концов... С уважением .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 29 сентября, 2009 Опубликовано 29 сентября, 2009 · Жалоба SasaVitebsk, вот как раз из-за того, что прогресс шагает и шагает я и предложил что такая утопия уже воплощена в каком-либо объёме. На самом деле я не написал ничего экстрасложного, разные части уже реализованы для того или иного языка программирования/интегрированной среды/etc. Многое из того, что я перечислил можно вообще получать на этапе компиляции. Но раз уж такая постановка задачи не нравится, то перефразирую её - "А есть ли в природе ещё профайлеры кроме gprof?". С другой стороны - система системе рознь и проектирование для каждой (по крайней мере у меня) существенно различаются подходы. Отлаживать программу всем форумом - это глупо :) Скажу просто - есть достаточно громоздкая система с кучей функций. Декомпозиция проведена не очень хорошо и надо это дело оптимизировать. Профайлер gprof может сказать сколько времени выполнялась та или иная функция и зависимость вызовов функций. Всё. Но порой этой информации мало. Описывать конкретнее в двух словах у меня всё равно не получится, да и потом выглядеть такое описание будет как глупая абстракция... В общем вот... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ReAl 0 29 сентября, 2009 Опубликовано 29 сентября, 2009 · Жалоба Посему вопрос знатокам - а есть ли в природе альтернативы этому чуду? Что бы мог указать зависимость вызовов функций, что бы мог указать время выполнения каждого куска кода, что бы мог сказать где и как переменные используются, что и зачем храниться в стеке и т.д. И при всём при этом что бы он имел хоть какой-нибудь графический интерфейс...Есть. Intel ® VTune Подумайте - как он это вытворяет и почему такое для AVR не пойдёт. И почему на AVR и с jtag что-либо похожее не выйдёт. Для AVR спасёт Полновесный аппаратный эмулятор, но это дорого и такие вещи что-то в последнее время не делаются Хороший программный симулятор с возможностью навешивать скрипт-хуки на всё, что шевелится - это будет виртуальный vtune. Но к нему надо адекватные модели "окружающей среды" понаписывать и "testbench" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 29 сентября, 2009 Опубликовано 29 сентября, 2009 · Жалоба Здесь уже неоднократно обсуждалось сообществом кто и как определяет "быстродействие функции". В основном - всё самопально. Обычно упоминают два варианта: "по осциллографу" и "по таймеру". Я, к примеру, использую "по таймеру", с расчётом максимального и среднего занчения. Если бы у меня стояла такая задача очень остро, то, наверное пришлось бы написать свою библиотеку для данных целей. Результат профиллирования размещал бы в озу и смотрел бы доступным мне образом. Например ч/з JTAG. Готовых програмных сред я не встречал. Мне кажется, что причина - высокая сложность и малая востребованность. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 29 сентября, 2009 Опубликовано 29 сентября, 2009 · Жалоба Результат профиллирования размещал бы в озу и смотрел бы доступным мне образом. Например ч/з JTAG. Консоль можно поднять... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ra3wum 0 30 сентября, 2009 Опубликовано 30 сентября, 2009 · Жалоба Используйте симуляторы и не парьтесь. Например HAPSIM или AVR Simulator IDE. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 30 сентября, 2009 Опубликовано 30 сентября, 2009 · Жалоба Скажу просто - есть достаточно громоздкая система с кучей функций. Декомпозиция проведена не очень хорошо и надо это дело оптимизировать. Вообще-то правильный путь думать, что творишь до и во время написания, а не после. Много эффективнее отладчиков, профайлеров.... Проверено :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sitafern 0 1 октября, 2009 Опубликовано 1 октября, 2009 · Жалоба А вот про IAR Systems WorkBench никто и не вспомнил. Понятно, что не всё из перечисленного там есть, но работать с профилировщиком там достаточно удобно. Хоть и симулятор, но представление о работе управляющей программы даёт. В принципе, когда работал ещё в DOS-е, то пользовался профилировщиком для "вылизывания программы". Только баловство всё это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 1 октября, 2009 Опубликовано 1 октября, 2009 · Жалоба правильный путь думать, Проверено :) Это очень , трудный путь :) Проверено :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 1 октября, 2009 Опубликовано 1 октября, 2009 · Жалоба RA3WUM, за HAPSIM спасибо, не знал о такой примочке))) А вот второе... Я не программирую на бейсике по религиозным причинам.... zltigo, да я сам проповедую такой подход, просто ситуация такая сложилась. Поставленную задачу я решал впервые, опыта проектирования программ подобного рода у меня мало да и решить задачу требовалось в самые кратчайшие сроки. Сейчас вроде всё работает, но мне жутко не нравится реализация. Чувствую сопровождать такую программу будет очень сложно. Сейчас пока времени более-менее хватает и пока я ещё помню что и зачем я делал я решил улучшить качество кода... sitafern, он платный ): В общем я так понял, что искомого мне не найти... Жаль. Поставил себе в блокнотик в разделе "долгосрочные задумки" заметку "сделать что-то подобное", авось у меня что-нибудь получится... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба Вы знаете, я тоже редко когда доволен кодом после написания. Видимо так устроен. :) Всегда найдётся что в проге улучшить. А знания приходят с опытом. Это замечательно, если можно что-то чуть-чуть подправить. Обычно это тупиковый путь. Обычно хочется переписать всё это заново с учётом сделанного. А это, чаще - невозможно. :) Зато новое изделие будет лучше предыдущего. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
UniBomb 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба SasaVitebsk, в моей пока ещё недолгой карьере я был доволен кодом всего один раз :) Прошивку для предыдущего прибора я писал довольно долго, менял методы решений, оптимизировал, сокращал и т.д. Зато когда я закончил - налюбоваться не мог (не то, что бы я бахвальством любил заниматься :) ). Ничего не прибавить, ничего не убавить, лепота :) А так в принципе любой инженер устроен - будь то программист или схемотехник (или ещё кто). И я считаю, что это здорово когда есть желание стремится к лучшему :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Diz 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба Время выполнения куска кода замеряю просто по таймеру. Вот таким образом: #define PROFILE( __Descr) for ( int __toDo = ({start_profile( __Descr); 1; }) ; __toDo; __toDo = 0, stop_profile()) static const char *profStr; void start_profile( const char *descStr) { if ( T1TCR) return; // Another profiling is on the way profStr = descStr; // Store description T1TCR = 0; // Stop timer T1MR0 = ~0; T1MCR = MR0R | MR0S; T1TC = 0; T1PC = 0; T1TCR = 1; } void stop_profile( void) { ulong Cnt; T1TCR = 0; // Stop timer Cnt = T1TC; ulong Ticks = ((double) (1.0/F_CPU * 1E6) * Cnt) ; fw_printf( ANSI_YELLOW"Profiling %s. About %lu ticks (%ldus)\n\r"ANSI_NORMAL, profStr, Cnt, Ticks) ; } Использование: PROFILE("drawing screen") { draw_screen(); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GDI 0 2 октября, 2009 Опубликовано 2 октября, 2009 · Жалоба Нечто подобное под названием профайлер есть в среде VisualDSP для Blackfin(да и для остальных камней от ADI). Если уж зашла речь о прогрессе и больших контроллерах... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться