Настройка компиляции в Arduino IDE
- Войдите на сайт для отправки комментариев
Вс, 22/05/2016 - 20:15
Добрый всем вечер.
Собственно захотелось поиграться с настройкой компиляции. В частности с уровнями оптимизации (O1, Os) и вытащить ассемблерный листинг avr-objdump'ом из файла ELF.
Не нашел, где записана строка с параметрами вызова avr-gcc и можно ли добавить вызов avr-objdump (кроме avr-gcc ещё вызывается avr-objcopy). Пока приходится вручную запускать avr-objdump и скармливать ему ELF.
Может кто знает? Спасибо.
Такое ощущение, что это где-то захардкожено...
строка с параметрами вызова avr-gcc и
У меня
<корень IDE>\hardware\arduino\avr\platform.txt
можно ли добавить вызов avr-objdump
Не знаю, я отдельно запускал.
У меня
<корень IDE>\hardware\arduino\avr\platform.txt
Вот спасибо. Похоже эту возможность добавили в новых версиях, начиная с 1.5.*. В старых версиях 1.0.* такого нет.
С уровнем оптимизации разобрался, а вот вызов objdump пока не получилось добавить.
В общем разобрался со всем. Расскажу, может ещё кому пригодится. Как уже упоминалось, всё настраивается в файле <корень IDE>\hardware\arduino\avr\platform.txt
1) Уровень оптимизации меняется в строках compiler.c.flags, compiler.c.elf.flags, compiler.cpp.flags. По умолчанию стоит -Os
2) Автоматический вывод ассемблерного листинга в файл с помощью утилиты avr-objdump делается через хуки (hooks). В platform.txt в секции AVR compile variables добавляем новые строки:
В секции AVR compile patterns, подсекции Create output files (.eep and .hex) добавляем строку:
(Описание всех хуков ЗДЕСЬ)
Всё, теперь после компиляции во временной папке что-то типа C:\Users\User\AppData\Local\Temp\build28f38fc51e0bd2ba8c700ba028289fe6.tmp\ рядом с файлами *.hex и *.elf появится файл *.lst с ассемблерным листингом (обычный текстовый файл, кому не нравится расширение - можно поменять на *.txt в строке compiler.objdump.flags).
P.S. По поводу костыля с батником. Утилиту avr-objdump можно вызывать напрямую из среды и передавать её параметры. Но Arduino IDE не обрабатывает символ вывода в файл ">" (который работает в виндовой консоли) и тупо ругается на него. Поэтому пришлось вызывать батник, передавать ему параметры, а уже он вызывает утилиту и делает вывод в файл.
P.P.S. Проверял на Arduino IDE версии 1.6.6. Хуки добавили с версии 1.6.5. А на старых версиях меньше 1.5.* файла platform.txt вообще нет.
Прикладываю свои файлы platform.txt и avr-objdump.bat
Пасибки, полезно.
Жека, а чем objdump удобнее, чем если сразу компилятору сказать, чтобы ассемблерный код выдал?
Вы про опцию -Wa,-ahls=file.lst ? У меня почему-то не получилось, запутался в хитросплетениях формирования всей строки с параметрами для avr-gcc. Да и проверил эту опцию в Atmel Studio - не понравился вид представления информации и форматирование. В общем, вывод objdump мне понравился больше. Но это так, с моей "любительской" точки зрения :)
Для сравнения, objdump:
avr-gcc:
Вы про опцию -Wa,-ahls=file.lst ?
я пишу вот так (в bat-айле):
-Wa,-a=C:\Arduino\build\%1.asm
Вроде, работает.
Сравнил Ваши листинги. objdump понравился больше. Попробую.
Лично мне objdump интересней тем, что его можно, когда нужно, запустить отдельным командником и получить асм листинг, а на постоянке оно нафиг не нужно. ИМХО, конечно же.
В принципе согласен. Но смысл был в том, чтобы один раз сделать и забыть. Если вдруг понадобился листинг - просто залез во временную папку и посмотрел. Оно же не хранится постоянно на ПК - после закрытия IDE временная папка со всеми файлами удаляется.
В принципе согласен. Но смысл был в том, чтобы один раз сделать и забыть. Если вдруг понадобился листинг - просто залез во временную папку и посмотрел. Оно же не хранится постоянно на ПК - после закрытия IDE временная папка со всеми файлами удаляется.
Да не вопрос, каждый волен поступать так, как ему хочется. Я же не осуждаю ;)
Вот только у меня большие сомнения, на счет фразы "один раз сделать и забыть", еще не факт, что в IDE что либо не поменяется, а командник он с IDE вообще не связан, он срабатывает на расширение файла и вызывает objdump. Разумеется, objdump могут переместить в другое место в IDE.
Уфф, кажется только отнимаю время у всех, я закончил. :)
А вот кусок листинга, сделанного IDA PRO 6.5
еще не факт, что в IDE что либо не поменяется
С этим согласен, в IDE периодически вносят довольно большие изменения.
а командник он с IDE вообще не связан, он срабатывает на расширение файла и вызывает objdump. Разумеется, objdump могут переместить в другое место в IDE.
Вот тут есть положительный момент: в platform.txt не используются абсолютные пути. Путь к objdump и *.elf подставляется автоматически: {compiler.path}, {build.path}. Название файла тоже: {build.project_name}. Хотя название можно и не использовать, а только путь к папке. А в батнике сделать срабатывание на расширение файла, как Вы и написали (но смысла в этом не вижу).
Objdump если и перенесут, то явно вместе с остальными утилитами и компиляторм, поэтому {compiler.path} будет всё так же работать.
P.S. я не ради спора, просто уточнил некоторые моменты.
На вкус и цвет все фломастеры разные ;) Думаю на том и сойдемся, я никогда не буду включать objdump в сборку, а Вы не будете писать командник, вот и все дела. И в этом нет ничего особенного, каждый прав по-своему.
Скажите как правильно в файл platform.txt добавить дефайн типа { #define NOMORE } , что бы он использовался только при компиляции .с файлов? Может быть куда то в строку compiler.c.flags ?
1. Скоро в Песочнице будет об этом материал.
2. НУ НУЖНО ничего менять в системных каталогах.
3. Ниже последовательность действий. Пример для Наны, есть токости, если у самого не получится со своей платой - пиши сюда - я помогу.
ИТАК (я описываю свой пример, который только что проверил):
1. в скетчбуке создаеи папку hardware, скорее всего она у тебя уже есть.
2. в ней папку wlad_nano;
3. в ней папку avr;
4. в ней файл boards.txt вот такой:
Это просто копия из системного про нано, ВАЖНЫЕ ДОБАВЛЕНИЯ:
а) "arduino:" - добавлено в трех местах, будь внимателен, это отсылка к общим настройкам.
б) ТО САМОЕ, ЧТО ТЫ ХОТЕЛ - последняя строчка определяет имя WLAD.
все это проверяем, выбирая при сборке плату: "Arduino Nano by Wlad".
вот проверочный скетч:
Если тебе нужны другие РЕЦЕПТЫ компиляции, то это сложнее, нужно создавать новую ПЛАТФОРМУ. Подожди тогда до статьи в Песочнице.
При выполнении сборки, порой требуется сначала выполнить дополнительные действия, например выполнить преобразования файлов перед сборкой.
В platform.local.txt добавляю
Рядышком с platform.local.txt положил тот самый prebuild.local, который выполнит prebuild в директории со скетчем если он там присутствует.
Здравствуйте. Сделал как написано в статье, но выскочила ошибка .... bin/avr-objdump.bat": file does not exist.
Подскажите как преодолеть эту проблему. у мене Aeduino IDE 1.8.12 версия.
Да, ярлык с админ правами не помог.
Написано же - Файл отсутствует.
Здравствуйте. Сделал как написано в статье, но выскочила ошибка .... bin/avr-objdump.bat": file does not exist.
Подскажите как преодолеть эту проблему. у мене Aeduino IDE 1.8.12 версия.
Так надо добавить путь к bin в PATH
Спасибо. Разобрался. .bat файл нужно разместить в папку bin: c:\Users\<your name>\AppData\Local\Arduino15\packages\arduino\tools\avr-gcc\7.3.0-atmel3.6.1-arduino5\bin\.
Корень Arduino IDE это ведь в Programms Files(x86).