Closed neko-neko-nyan closed 4 years ago
А есть идеи, как разделить релизы, чтобы автоматически выбирался пакет? Или сделать несколько версий и не мучиться?
Можно сделать один релиз на две ос. Т.е. просто докинуть линуксовый avr-gcc рядом с виндовым, а в конфигах не указывать расширение бинарников. Но так сработает только если у них отличаются только бинарники, а все заголовки/линкскрипты/etc одинаковые. Надо проверять.
Слушай, вопрос из твоего реквеста мне покоя не даёт: откуда инфа, что const'ы заменяются дефайнами при компиляции? Все таки это абсолютно разные штуки, и конст много чем выигрывает у дефайна, сидя даже в SRAM. Сейчас много читал, видимо можно только опытным путем выяснить, где сидит const...
Они не "заменяются дефайнами". При включенной оптимизации они работают аналогично. При выключенной оптимизации (опция -O0
) const будет работать как обычная переменная. В новых версиях компилятора еще можно использовать constexpr, в основном смысл тот же. Проверить сравнительно не сложно. https://onlinedisassembler.com/odaweb/ (File > Upload file, все остальное по умолчанию). Только туда надо запихивать не hex, а elf файл.
"они работают аналогично" - то есть при сотне вызовов они займут сотню раз свой объем в памяти, или только один раз?
При включении оптимизации const не занимает места в памяти (ни во флеш, ни в рам) и не требует накладных расходов на чтение. При отключении оптимизации переменная с const не будет отличаться от переменной без const, а значит будет занимать место во флеше и в рам, а так же будет работать медленнее из-за чтения из рам. При сотне переменных (const) без оптимизации они займут свой объем памяти. Количество обращений к каждой переменной при этом не важно.
Что значит не занимает места в памяти? Если у меня константа - число, оно будет фигурировать в коде, никуда не денется. Пытаюсь понять, дефайн хуже констант в этом плане, или нет
То и значит. Оптимизатор заинлайнит константу как будто она была написана прямо в коде. Из-за этого могут быть применены другие оптимизации, например специальные инструкции процессора.
"написана прям в коде" - значит во flash хранится
Да, но нет. Она заинлайнена в команды процессора, а не хранится отдельно во флеше и не читается оттуда отдельной командой.
Условно (я avr ассемблер не знаю) для кода
const int b = 5;
int main(){
int a = 3;
a += 5;
// use a
}
будут команды
загрузить 3 в регистр 1
прибавить 5 к регистру 1
вместо
загрузить 3 в регистр 1
загрузить значение по адресу 123 в регистр 2 // чтение из рам, медленное + само значение лежит там
прибавить значение регистра 2 в регистр 1
Потом оптимизатор может ещё упростить до загрузить 8 в регистр 1
, так как все значения известны.
Хм.... Так как все таки лучше хранить те же константы пинов? Дефайн или конст, или неважно?.. я проводил тест, по памяти кушало одинаково. Но что там на самом деле происходит неизвестно, компилятор то творит всякое Новую версию с компилером под линуху выкатим на днях, сейчас нашлась пара багов в функциях, надо пофиксить
Если одинаково, то const лучше. Можно сравнить итоговый машинный код, ссылка выше. Кстати, какая версия компилятора?
Уже посмотрел. А почему не 9.х?
Точно, гляну исходник попробую. Версия 9.х утяжеляет бинарник по сравнению со стандартной версией (v5 вроде). А 8.х бинарник легче чем в 5 версии... В крупных проектах до 700б флэша экономит
С версии 1.9 не работает на линуксе. Надо добавить avr-gcc скомпилированный под линукс.