Я пытаюсь написать программу для ATTiny13. Моя проблема в том, что он имеет огромные ограничения по размеру. Что ж, при создании моей первой программы Hello World потребовалось 100 байт программного пространства, чтобы включить и выключить свет! Есть ли варианты, которые я могу дать avr-gcc, чтобы уменьшить этот размер? Кроме того, что находится в crt0? Я не слишком увлечен сборкой AVR, поэтому не очень разбираюсь в ней ..
Я не хочу бросать сборку для этого проекта ..
avr
attiny
programming
compiler
Earlz
источник
источник
Ответы:
crt0 - процедура запуска для ОК. Подпрограммы выполняют настройку регистров, а также инициализацию данных.
Включает ли 100 байтов таблицу векторов прерываний? Я не уверен насчет ATtiny13, но ATtiny25 / 45/85 имеет 15 векторов прерываний. Это займет 30 байтов.
У gcc есть опция для ссылки в вашем crt0. Вы можете взять файл AVR crt0.S и изменить его. Это не очень долго, поэтому это не должно быть трудно сделать.
источник
/avr-libc-1.6.7/avr/lib/avr2/attiny13/crttn13.S
Вы можете использовать avr-objdump -d .elf, чтобы увидеть, что генерируется:
Давайте немного разберемся:
20-байтовая таблица векторов прерываний (по крайней мере, некоторые записи можно было бы опустить, если бы вы настаивали и обещали, что никогда не включите соответствующие прерывания).
Очищает SREG (я не уверен, что это действительно необходимо), записывает 0x9f (RAMEND) в SPL (указатель стека) и переходит к основному. Последний rjmp является излишним. (вы могли бы обещать никогда не возвращаться с основного)
Процедура прерывания по умолчанию для тех прерываний, которые не были перезаписаны в C. (те же правила, что и для __vectors)
Ваш основной процесс. Плотно.
Эти два не очень полезны. _exit, вероятно, требуется стандартом C, и __stop_program необходим для того, чтобы он работал как надо.
источник
Какова ваша возможная заявка? ATtiny13 имеет 1 КБ флэш-памяти, и вы можете многое сделать с этим в C. crt0 - это среда выполнения avr-libc C. Он содержит такие вещи, как обработка стека, поэтому вы можете использовать функции с аргументами и возвращаемыми значениями.
100 байтов для установки встроенного Си не так уж и плохи, и это постоянный размер. Удвоение строк программной логики не обязательно составит 200 байт. На каком уровне оптимизации вы компилируете? Вы должны быть в "-Os". И как вы это компилируете? Makefiles в демонстрационных проектах, доступных на сайте avr-libc, довольно хороши и полны.
Простая программа включения / выключения светодиода ниже занимает 62 байта на ATtiny13 с «-Os» на avr-gcc 4.3.3. от CrossPack-AVR:
Удаление вызовов _delay_ms () делает его 46 байтов.
Большим примером на ATtiny13 являются мои прототипы Smart LED . Этот код содержит 3-канальный программный ШИМ, преобразование цветов HSV в RGB, конечный автомат и считывает две кнопки. Он не очень хорошо написан и занимает 864 байта. Под avr-gcc 3.x он был еще меньше. (по какой-то причине avr-gcc 4 увеличил почти все программы на несколько байтов)
источник
avr-gcc -std=c99 -Wall -Os -mmcu=attiny13 -o hello.out helloworld.c
является соответствующей строкой в моем make-файле (самостоятельно создан). и я использую почти идентичный код, за исключением того, чтобы перевернуть светодиод, который я использую,PORTB &= ~(1 << LED);
и тому подобноеЕсли у вас мало места, попробуйте встроенный верстак IAR - их бесплатная версия «кикстарта» имеет ограничение размера кода в 4K, что достаточно для ATTiny и, возможно, лучше для оптимизации, чем для gcc.
источник
Такие устройства часто программируются на ассемблере, что приводит к уменьшению размера исполняемых файлов. Стоит приложить усилия и научиться им пользоваться.
источник