Как уменьшить размер импортированной библиотеки DigiKeyboard

Я работаю над проектом с Digispark ATTiny85, который выполняет нажатия клавиш с помощью библиотеки DigisparkKeyboard (https ://github.com/digistump/DigisparkArduinoIntegration/tree/master/libraries/DigisparkKeyboard). Помимо DigiKeyboard, я также импортирую EEPROM.h.

Мой собственный код составляет всего около 150 строк, я сократил размер, следуя ряду онлайн-руководств, пытаясь избежать больших типов данных и т. д. Digispark ограничен ~ 6 КБ, а импортированная библиотека DigiKeyboard занимает чуть больше 5,4 КБ. Суммарно скомпилированный проект занимает около 7кБ, что превышает возможности платы.

Из библиотеки DigiKeyboard я использую только DigiKeyboard.sendKeyStroke() и DigiKeyboard.print() (всего около десяти разных символов). Поэтому я предполагаю, что есть много неиспользуемого кода, который я мог бы удалить, но я не знаю, как к этому подойти. Я использую Visual Studio Code и PlatformIO.

Как я могу уменьшить размер используемой библиотеки DigisparkKeyboard?

, 👍4

Обсуждение

Вы печатаете номера или только фиксированные сообщения? В последнем случае поможет ли использование write() вместо print()?, @Edgar Bonet

Кроме того, у меня нет опыта работы с PlatformIO, но я думаю, вы должны иметь возможность включить «подробный» режим, который показывает вам полную команду, используемую для вызова компилятора. Не могли бы вы проверить, содержит ли эта команда опцию -flto?, @Edgar Bonet

Спасибо @EdgarBonet! Флаг компилятора -O3 -flto не изменил для меня ни байта, и я не смог найти никакой документации по write(). Однако я переключился на .sendKeyStroke для всех операций записи из .print(), что сократило примерно 3 КБ! и код подходит к плате! Если сформулируете ответ, с радостью приму!, @emma.makes

Я только что заметил, что большой проблемой здесь было не включение print(), а скорее один единственный экземпляр print, где я сделал: DigiKeyboard.print("Time: "+String(round(runtime/1000) )). Поэтому я считаю, что большой код был связан с включением String()., @emma.makes

Re «_Если сформулируете ответ, с удовольствием приму!_»: Ну вообще-то ты сам нашел свое решение! В таком случае рекомендуется попрактиковаться, чтобы опубликовать и принять свой собственный ответ., @Edgar Bonet


2 ответа


Лучший ответ:

4

С помощью @EdgarBonet я изучил используемые функции, и оказалось, что функция String(), которую я однажды использовал в своем коде, занимает около 3 КБ места в скомпилированной программе. .

В итоге я удалил строку с помощью String() и оставил импортированную библиотеку DigiKeyboard как есть.

,

1

Компилятор/компоновщик автоматически удалит неиспользуемые функции/методы, поэтому я сомневаюсь, что вы сможете сэкономить память, удалив неиспользуемые функции/методы самостоятельно.

Однако вы могли бы выиграть за счет:

  • Удаление вызовов функций/методов проверки, когда вы знаете, что результат всегда будет false, true или всегда будет одним и тем же числом, строкой или типом данных в целом.
  • Удаление (частей) функций/методов, связанных с физическими или логическими функциями, которые вы никогда не используете. Как, например, операторы if, case, которые никогда не будут применяться).
  • Запретить использование всего класса (например, String) (см. второй комментарий Эммы Мейкс ниже).
,

Спасибо за ваш отзыв! Я не знал, что неиспользуемые функции и методы в любом случае не включены! Мне удалось сократить примерно 3 КБ, переключившись с .print() на .sendKeyStroke! Я буду иметь в виду другие предложения для будущих выпусков!, @emma.makes

Мне нужно отредактировать комментарий, но уже слишком поздно. Уменьшение размера произошло не из-за замены print() на sendKeyStroke(), а из-за того, что я не использовал String(), который я ранее использовал в вызове функции print() ., @emma.makes

Это также действительно хороший способ уменьшить размер, чтобы предотвратить использование полного класса (String в вашем случае). я добавлю это к моему ответу, @Michel Keijzers