Я хочу сделать эскиз как можно меньшего размера для целей тестирования. Проблема в том, что когда я компилирую эскиз BareMinimum (с пустой установкой и циклом), я получаю 466 байт для Uno и колоссальные 4242 для Leonardo. Есть ли способ написать свой собственный код, который не имеет дополнительных функций (а именно, Timer0 для millis()
и delay()
). Я также хотел бы иметь возможность отключить функции клавиатуры / мыши для Leonardo.
9
Ответы:
Вы должны быть в состоянии создать свое собственное определение доски с помощью специального файлаboards.txt в соответствии с https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification . Как я вижу, в определении Леонардо есть несколько особенностей usb. Я надеюсь, что включение в компиляцию 4K основано на этих флагах, а не на типе процессора.
Где board.txt будет использовать загрузку, разделы загрузчика от Leonardo и сборки от Uno.
Все это при условии, что сборка базовой библиотеки не использует специфичные для процессора флаги для включения функций USB.
Если вы получаете такие рабочие. отпишитесь, я уверен, что другие будут заинтересованы в таком.
Я недавно столкнулся с этим 4K использованным ограничением на демонстрационной версии библиотеки, которая фактически превысила UNO и должна была вставить
вокруг большого куска дополнительных функций в эскизе, чтобы поместиться на Леонардо.
Я предположил (неправильно), что этот 4K был, потому что я все еще включал Serial.print, который, когда через CDC USB на Leo. Но я вижу после сброса памяти пустого эскиза они все еще там.
Что имеет смысл. Поскольку Леонардо все еще требуется клиент USB-CDC (4K), чтобы обнаружить 1200 бод-соединение от AVR-DUDE, чтобы запустить удаленную перезагрузку.
Следовательно, создание собственного board.txt без USB в сборке также должно иметь
удален.
После загрузки на цель это потребует синхронизации загрузки с ручным сбросом цели. По мере возможности удаленная перезагрузка теряется.
источник
Я недавно хотел сделать именно это. Так как нет хорошего способа сделать это, я решил написать патч для плагина Stino Sublime -Text Arduino, чтобы сделать именно это. Впоследствии он был принят, поэтому он должен быть в любой современной установке Stino.
Это добавляет новую опцию в Stino:
Использование этого режима приводит к результатам компиляции, подобным следующему:
Для Уно:
Для леонардо
На самом деле программирование leonardo с вышеупомянутым скомпилированным выводом, вероятно, плохая идея, так как это может нарушить функцию автоматического сброса, но вы можете , если хотите. Хет-кончик mpflaga за то, что отметил это в своем ответе.
Обратите внимание, что отчеты о памяти на самом деле неверны, но это отдельная проблема .
Код, используемый для вышеупомянутого:
Некоторые заметки:
milis()
или подобное.#include <Arduino.h>
.main
. Вы никогда не вернетесь изmain
. Если вы хотите что-то настроить, он идет доwhile (1)
.источник
Хотя это зависит от вашего эскиза, вы можете несколько уменьшить размер, повторно используя код с методами.
Возьми этот код:
1322 байта на Arduino Uno. Теперь давайте немного его уменьшим:
1194 байта. Это примерно на 10% меньше!
В любом случае, хотя это не сильно сокращает эскиз, иногда это может быть самый простой маршрут, когда вы превышаете ограничение на два байта, или просто хотите сделать более компактный эскиз для начала без потери функциональности. Это не для каждой ситуации, но иногда я нахожу это полезным.
источник
@annonomus penguin, конечно, мы можем Хотя код компилируется во флэш-память 1180 байт + 13 байт оперативной памяти для uno на моем компьютере, мы можем улучшить его :), поэтому мы приняли вызов для игры в гольф, а также несколько полезных советов, поскольку мы находимся в бизнесе обучение.
Шаг 1: уменьшить переменные требования. Использование int для светодиодного порта кажется излишним, у нас, конечно, нет 65535 адресуемых портов ввода-вывода на Arduino :). Поэтому мы изменим его на байт просто для удовольствия. Позже мы изменим его на #define, чтобы показать влияние использования слишком больших типов переменных.
Компилируется в 1172 байта + 13 байтов ОЗУ. Это экономит 8 байт флэш-памяти благодаря меньшему количеству необходимых операций для байта вместо целого числа. Я ожидал бы 12 байтов оперативной памяти, но хорошо. Не так много, но каждый сохраненный байт - это хорошо.
Шаг 2: измените переменную на определяет, когда это имеет смысл. Например, светодиодный байт не нужен, вывод не распаяется.
Компилируется в 1142 байта flash + 11 байтов оперативной памяти. Уже 38 байтов сохранено. Это связано с меньшим количеством операций регистра, необходимых для получения значения int. Также мы сохранили 2 байта из оперативной памяти. (все еще удивляюсь, почему байт не скомпилирован в 1 байт оперативной памяти .....)
Шаг 3: оптимизировать код. Я вижу 2 задержки. Интересно, если бы я изменил его на 1 задержку, это бы сэкономило место, но я должен выяснить значение светодиода и переключить (инвертировать) его. Мы можем сделать это с помощью digitalRead (), но сэкономит ли это место?
Компилируется в 1134 байта + 11 байтов оперативной памяти. Ура! еще 8 байтов. Это составляет в общей сложности 46 байтов и на 2 строки кода меньше.
Также еще один общий совет по уменьшению размера кода. Не используйте класс String. Это ОГРОМНО, узнайте, как обращаться с массивами символов, strcpy (), strcmp (). Если все, что у вас есть, это некоторые базовые строковые операции, то использование класса String в основном просто тратит пространство как на флэш-память, так и на RAM.
источник