AlexGyver / GyverCore

Быстрое ядро для Arduino IDE
https://alexgyver.ru/gyvercore/
GNU Lesser General Public License v3.0
127 stars 13 forks source link

Поддержка linux #4

Closed neko-neko-nyan closed 4 years ago

neko-neko-nyan commented 4 years ago

С версии 1.9 не работает на линуксе. Надо добавить avr-gcc скомпилированный под линукс.

AlexGyver commented 4 years ago

А есть идеи, как разделить релизы, чтобы автоматически выбирался пакет? Или сделать несколько версий и не мучиться?

neko-neko-nyan commented 4 years ago

Можно сделать один релиз на две ос. Т.е. просто докинуть линуксовый avr-gcc рядом с виндовым, а в конфигах не указывать расширение бинарников. Но так сработает только если у них отличаются только бинарники, а все заголовки/линкскрипты/etc одинаковые. Надо проверять.

AlexGyver commented 4 years ago

Слушай, вопрос из твоего реквеста мне покоя не даёт: откуда инфа, что const'ы заменяются дефайнами при компиляции? Все таки это абсолютно разные штуки, и конст много чем выигрывает у дефайна, сидя даже в SRAM. Сейчас много читал, видимо можно только опытным путем выяснить, где сидит const...

neko-neko-nyan commented 4 years ago

Они не "заменяются дефайнами". При включенной оптимизации они работают аналогично. При выключенной оптимизации (опция -O0) const будет работать как обычная переменная. В новых версиях компилятора еще можно использовать constexpr, в основном смысл тот же. Проверить сравнительно не сложно. https://onlinedisassembler.com/odaweb/ (File > Upload file, все остальное по умолчанию). Только туда надо запихивать не hex, а elf файл.

AlexGyver commented 4 years ago

"они работают аналогично" - то есть при сотне вызовов они займут сотню раз свой объем в памяти, или только один раз?

neko-neko-nyan commented 4 years ago

При включении оптимизации const не занимает места в памяти (ни во флеш, ни в рам) и не требует накладных расходов на чтение. При отключении оптимизации переменная с const не будет отличаться от переменной без const, а значит будет занимать место во флеше и в рам, а так же будет работать медленнее из-за чтения из рам. При сотне переменных (const) без оптимизации они займут свой объем памяти. Количество обращений к каждой переменной при этом не важно.

AlexGyver commented 4 years ago

Что значит не занимает места в памяти? Если у меня константа - число, оно будет фигурировать в коде, никуда не денется. Пытаюсь понять, дефайн хуже констант в этом плане, или нет

neko-neko-nyan commented 4 years ago

То и значит. Оптимизатор заинлайнит константу как будто она была написана прямо в коде. Из-за этого могут быть применены другие оптимизации, например специальные инструкции процессора.

AlexGyver commented 4 years ago

"написана прям в коде" - значит во flash хранится

neko-neko-nyan commented 4 years ago

Да, но нет. Она заинлайнена в команды процессора, а не хранится отдельно во флеше и не читается оттуда отдельной командой.

neko-neko-nyan commented 4 years ago

Условно (я 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, так как все значения известны.

AlexGyver commented 4 years ago

Хм.... Так как все таки лучше хранить те же константы пинов? Дефайн или конст, или неважно?.. я проводил тест, по памяти кушало одинаково. Но что там на самом деле происходит неизвестно, компилятор то творит всякое Новую версию с компилером под линуху выкатим на днях, сейчас нашлась пара багов в функциях, надо пофиксить

neko-neko-nyan commented 4 years ago

Если одинаково, то const лучше. Можно сравнить итоговый машинный код, ссылка выше. Кстати, какая версия компилятора?

neko-neko-nyan commented 4 years ago

Уже посмотрел. А почему не 9.х?

AlexGyver commented 4 years ago

Точно, гляну исходник попробую. Версия 9.х утяжеляет бинарник по сравнению со стандартной версией (v5 вроде). А 8.х бинарник легче чем в 5 версии... В крупных проектах до 700б флэша экономит