Как уменьшить размер импортированной библиотеки 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?
@emma.makes, 👍4
Обсуждение2 ответа
Лучший ответ:
С помощью @EdgarBonet я изучил используемые функции, и оказалось, что функция String()
, которую я однажды использовал в своем коде, занимает около 3 КБ места в скомпилированной программе. .
В итоге я удалил строку с помощью String()
и оставил импортированную библиотеку DigiKeyboard как есть.
Компилятор/компоновщик автоматически удалит неиспользуемые функции/методы, поэтому я сомневаюсь, что вы сможете сэкономить память, удалив неиспользуемые функции/методы самостоятельно.
Однако вы могли бы выиграть за счет:
- Удаление вызовов функций/методов проверки, когда вы знаете, что результат всегда будет
false
,true
или всегда будет одним и тем же числом, строкой или типом данных в целом. - Удаление (частей) функций/методов, связанных с физическими или логическими функциями, которые вы никогда не используете. Как, например, операторы
if
,case
, которые никогда не будут применяться). - Запретить использование всего класса (например,
String
) (см. второй комментарий Эммы Мейкс ниже).
Спасибо за ваш отзыв! Я не знал, что неиспользуемые функции и методы в любом случае не включены! Мне удалось сократить примерно 3 КБ, переключившись с .print()
на .sendKeyStroke
! Я буду иметь в виду другие предложения для будущих выпусков!, @emma.makes
Мне нужно отредактировать комментарий, но уже слишком поздно. Уменьшение размера произошло не из-за замены print()
на sendKeyStroke()
, а из-за того, что я не использовал String()
, который я ранее использовал в вызове функции print()
., @emma.makes
Это также действительно хороший способ уменьшить размер, чтобы предотвратить использование полного класса (String в вашем случае). я добавлю это к моему ответу, @Michel Keijzers
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
- Изменение последовательности символов
- Как объявить массив переменного размера (глобально)
- Arduino nano как клавиатура HID
- Как компилировать, загружать и контролировать через командную строку Linux?
- Предупреждение при проверке скетча с кодом VS
- Keyboard.h не найден
Вы печатаете номера или только фиксированные сообщения? В последнем случае поможет ли использование
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.makesRe «_Если сформулируете ответ, с удовольствием приму!_»: Ну вообще-то ты сам нашел свое решение! В таком случае рекомендуется попрактиковаться, чтобы опубликовать и принять свой собственный ответ., @Edgar Bonet