ВОПРОС К БЫВАЛЫМ (от новичка) оптимизация кода.
- Войдите на сайт для отправки комментариев
Чт, 23/10/2014 - 14:20
Есть ли какой ни будь програмный комплекс, программно имулирующий arduino, с возможностью дебага кода, что то вроде отладчика 1С. Задача: посмотреть ход выполнения программы (в некомпелированном виде), удалить неиспользуемые участки библиотек, затем максимальная оптимизация кода. Так же неплохо было бы видеть насколько какой из вариантов кода загружает процессор и занимает ОЗУ. PS Желательно бесплатное.
Зачем Вам ардуино? Пишите сразу на С++ или асме, там и дебагеры есть и все что нужно
Я в общем то новичёк в этом деле, хотелось бы брать готовое и допиливать под свои нужды, а не пилить самому.
Atmel Studio 6.2 с плагином Visual Micro,еще в Proteus,кажеться есть возможность дебажить.
скажу по секрету : язык для Ардуино основан на диалекте C++,поэтому что либо оптимизировать,без знания языка,просто бессмысленно.
лучшая оптимизация проводиться на ASMе
удалить неиспользуемые участки библиотек, затем максимальная оптимизация кода.
по еще большему секрету скажу,только вообще никому,тссс :
когда вы подключаете какую либо библиотеку к скетчу,не обязательно компилятор использует весь код библиотеки,а лишь те участки которые ему нужны : задействованные функции,структуры и т.д..
предположим библиотека может обслуживать (скажем так) несколько протоколов, для этого она имеет область определения этого самого протокола и подбиблиотеки для работы с ними(протоколами). я со своей стороны выясняю нужный мне протокол и удаляю область определения протокола и невостребованные протоколы, передовая упровление функции с явно прописанным протоколом. как то так, как смог так и сформулировал.
во 1-ых,пытался понять что вы вкладываете в понятие "протокол",какую часть кода\библиотеки : функция,цикл,структуры,Thread..понятия не имею
во 2-ых,я четко и коротоко сказал : компилятор берет то что ему надо,что ненадо не берет и не компилирует.зачем вам делать за компилятор его работу ?
напротив,если вы удалите то чем компилятор пользуеться : допутим в библиотеке stdio.h удалите функцию printf,а потом в вами написаном коде ее вызовете,будет много ошибок и "головной боли",скорее всего на форуме.
в 3-их : Оптимизация - это просто огромнейшая область в математике и Computer Science,что говорит о том что протсым удалением кода из библиотек,вряд ли можно чего либо добиться существенного.
в-4: вместо того что бы сидеть на форуме и гадать,как и что можно удалить,вначале поняли бы как оно вообще все работает,гадать то можно бесконечно,толку 0 будет.
Поверте мне: пытаюсь.
Как я понял: из 32к памяти, 2к занимает загрузчик, да ещё в добавок код
1
void
setup
() {}
2
void
loop
() {}
занимет ещё 0,5к
Разбег для творчества скажем так: не большой.
какие у вас цели,если не секрет ?
сразу скажу,что 29кБ это очень много для микроконтоллера,иные умудряються впихнуть в нее операционную систему.
если ваш код по каким либо причинам выходит за рамки,то вероятнее всего вы просто выбрали не ту платформу для реализации ваших задумок : например обработка видео,или картинок,Ардуино для этого не предназначена.
если же проблемма нехватки памяти именно из за статичных массивов данных ,то можно подключить и внешнюю память.
можно избавиться от бутлоадера,он как таковой ненужен,но прошивать прийдеться через отдельный программатор.
Вы объект от ссылки в С на вскидку отличите? Если нет, то Вам эта задача не дастся, если да - то Вам дебаггер и не нужен собственно. Проанализировать в редакторе 2-3к строчек не такая уж и проблема.
Поверте мне: пытаюсь.
Как я понял: из 32к памяти, 2к занимает загрузчик, да ещё в добавок код
1
void
setup
() {}
2
void
loop
() {}
занимет ещё 0,5к
Разбег для творчества скажем так: не большой.
ясно - художник работает в стиле минимализьма.
рекомендую максимально ограничить себя в ресурсах и пользовать исключительно тину2313.
или попробовать написать скетч размером более 30 килобайт и, только после того, парить мосг себе и народу.
Чувак, wiring (да и любой язык типа C) уже изначально так построен что если там что-то не используется, это просто не компилируется. Это называется отпимизация по размеру кода - именно та оптимизация, которой программа подвергается в первую очередь. Так что нет там никакого смысла что-то выковыривать из библиотек.
Кроме того, много флеша нужно только в двух случаях:
1. Много объектов. Например - LCD, RFId, DMX, трансиверы (RF24, RF905 и т. п.), IR, датчики, эхолоты, моторы, сеть (ENC28J60, W5100) и т. д. Звиняйте, но одновременно такую кучу на одном процессоре, надеясь на безглючную работу, поставит только пациент специального медицинского учреждения, им. Кащенко например. А вменяемые люди задачи разделяют. Кроме того, если очень надо запилить мегаофигенный девайс, можно использовать многоядерную систему - много Ардуин (много это значит больше одной, если непонятно) которые обмениваются информацией через i2c, сериал, программный сериал.
2. Хранение во флеше программ переключения гирлянд. Ну или не гирлянд, короче массив данных, который выводится на порты по принципу плеера. Такой финт ушами - терпим при объёме этого массива не более 8-16 кб. Иначе - уже дурной тон, существует i2c память и SD-флешки.
Во всех остальных случаях острая нужда только в оперативе. Которая экономится путём распределения задач между устройствами. Ну если прижмёт, можно сериал оторвать - у него 128 байт занято под буфер.
А ещё есть Atmega1284. У ней не 2k мозгов а целых 16. Правда флеша мало, у Mega2560 больше.
попробовать написать скетч размером более 30 килобайт
наверное вы правы, если задуматся: если код "А" занимает 5Кб и код "Б" занимает 5Кб, то скорее всего "А+Б"<10Кб (по крайней мере на 0,5Кб).
Всем СПАСИБО за помощь.
Вывод: решать проблемы по мере их появления.
http://habrahabr.ru/post/240689/
попробовать написать скетч размером более 30 килобайт
наверное вы правы, если задуматся: если код "А" занимает 5Кб и код "Б" занимает 5Кб, то скорее всего "А+Б"<10Кб (по крайней мере на 0,5Кб).
Не знаю тролль вы или нет,но Клапауций прав
Даю пример : 2 программы
01
#incluide<stdio.h>
02
void
main(){
03
printf(
"Hello World"
);
04
}
05
06
#include<stdio.h>
07
void
main(){
08
int
a;
09
scanf(&a);
10
}
допустим чисто от балды,каждая программа занимает по 3кб.
вы будете удивлены если совместите 2 программы в 1 и посмотрите размер.
вы будете удивлены если совместите 2 программы в 1 и посмотрите размер.
Я о том же и говорю, даже на примере того что пустой код весит 0.5КБ, если объеденить две проги, по любому базовые функции 2 раза грузится не будут, не говоря уже о повторном инклюде одной и той же библиотеки(в вашем примере). К примеру: используем мы(в скетче "А") некоторую библиотеку "А" которая использует некоторое количество (пускай будет 1КБ) своей уникальной информации и предположим 4КБ базовых функцийы . И в скетче "Б" используем некоторую библиотеку "Б" которая в свою очередь использует 1КБ своей инфы и 4КБ базовых. Если объеденить оба скетча в один, то при условии отсутствия в коде используемых совместно одних и техже базовых функций(что крайне маловероятно) то общий код будет максимальным размером "А+Б-0,5КБ", а может случится так что в обоих скетчах базовые функции используются одни и теже, и будут грузится 1 раз(4КБ), плус к ним 1КБ билиотеки "А" и 1КБ библиотеки "Б", ну и конечно же 0,5КБ тела скетчка и мы получим 6,5КБ. Я всё это к тому что по мери разростания(использования новых библиотек, не путать с быдло кодингом) кода его объём(в компелированном виде) ,с большой вероятность, будет использовать меньше новых базовых функци так как они вероятнее всего уже были определены ранее. Вот нагородил то, да уж не быть мне преподователем.