Вывод команды size
является хорошей отправной точкой, но не дает вам всей необходимой информации.
$ avr-size program.elf
text data bss dec hex filename
Размер вашего изображения обычно немного больше, чемсумма текста и данных разделов.Секция bss по сути сжатая, потому что это все 0.Могут быть и другие релевантные разделы, которые не перечислены по размеру.
Если ваша система сборки настроена так, как я использовал ранее для микроконтроллеров AVR, то вы получите * .elfфайл, а также файл * .bin и, возможно, файл * .hex.Файл * .bin - это фактическое изображение, которое будет храниться во флэш-памяти процессора процессора, поэтому вы можете проверить его размер, чтобы определить, как растет ваша программа, когда вы вносите в нее изменения.Файл * .bin извлекается из файла * .elf с помощью команды objdump и некоторых флагов, которые я сейчас не могу вспомнить.
Если вы хотите знать, как угадать, сколько выКод на C или C ++ будет генерироваться при компиляции, это намного сложнее.Я наблюдал 10-кратное увеличение в функции, когда я пытался использовать uint64_t, а не uint32_t, когда все, что я делал, увеличивало его (это было примерно в 5 раз больше кода, чем я думал).В основном это было связано с тем, что оптимизации gcc avr не были лучшими, но небольшие изменения в размере кода могли бы появиться из, казалось бы, невинного кода.
Это, вероятно, будет усилено с использованием C ++, который имеет тенденцию скрывать большевещи, которые превращаются в код, чем С.Главным среди вещей, которые скрывает C ++, являются вызовы деструкторов и множество разыменований указателей, которые связаны с указателем this
в объектах, а также с секретным указателем, который многие объекты имеют для своей таблицы виртуальных функций и статических переменных класса.
На AVR все эти вещи с указателями, вероятно, действительно складываются, потому что указатели в два раза больше регистров и требуют загрузки нескольких инструкций.Кроме того, AVR имеет только несколько пар регистров, которые можно использовать в качестве указателей, что приводит к множеству перемещений в эти регистры и из них.
Некоторые советы для небольших программ в AVR:
Используйте uint8_t
и int8_t
вместо int
, когда можете.Вы также можете использовать uint_fast8_t
и int_fast8_t
, если хотите, чтобы ваш код был переносимым.Это может привести к тому, что многие операции будут занимать только половину кода, потому что int
- это два байта.
Осознайте такие вещи, как строковые и структурные константы и литералы и как / гдеони сохраняются.
Если вы не боитесь этого, прочитайте руководство по сборке AVR.Вы можете получить представление о типах инструкций, а также о типе кода C, который легко сопоставляется с этими инструкциями.Используйте такой код С.