"Впихнуть невпихуемое" или как найти место для нужных опций Marlin, если все ненужные уже отключены.

awa32
Идет загрузка
Загрузка
15.02.2020
3747
13
Техничка

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых постах.

Отписаться от уведомлений вы всегда сможете в профиле автора.

20
Статья относится к принтерам:
Ender 3

Помните рассказ "История одного байта"? Мне тоже не хватало нескольких байт. Всё ненужное и не очень нужное было уже отключено. Конфиги Marlin просмотрены до дыр, а попробовать LIN_ADVANCE очень хотелось. И тут мне в голову пришла банальная мысль ...

Но сначала немного предыстории. Кого интересует сразу суть - проматывайте текст до таблицы.

Принтер Creality Ender-5 у меня появился совсем недавно, с прошлогодней ноябрьской распродажи на али. Благодаря невиданной щедрости китайцев обошелся он мне всего в $120. Давно хотел себе, но жаба не позволяла, а здесь такой случай.

Вообще, я в 3D печати был (да и сейчас) полный чайник. Нет, теоретически я конечно представлял как это все работает. На видео, да и в живую видел. Знал, что нужно модель нарезать в "слайсере". Если бы я еще знал тогда, сколько одних настроек в Куре. Так вот, собрал я принтер, нарезал модель в слайсере с комплектной SD карты с настройками по умолчанию. Напечатал и был приятно удивлен качеством что называется "из коробки".

Одно расстраивало - кривой стол. Если приложить линейку то видна приличная яма в центре стола. Начитавшись на эту тему понял, что кривой стол - это распространенное явление, а BL Touch в такой ситуации очень помогает. Ну или стекло вместо коврика. Тут как раз очередная распродажа на али подоспела. В результате за полцены был куплен набор "Creality 3D Original BL Touch". И вот, датчик установлен, с сайта Creality скачана прошивка с поддержкой BL Touch и успешно прошита в принтер. Вроде все работает, при включении принтера датчик клацает "жалом". Запускаю Bed Leveling, принтер начинает замерять первую точку, вторую, едет к третьей и начинает поднимать стол. Но датчик висит уже за пределами стола, в воздухе! Пока я понял в чем дело и выключил принтер, сопло уже успело воткнуться в коврик и даже повредить его немного. Погуглив, нашел жалобы людей на такое же поведение штатной прошивки, но готовой нормальной прошивки небыло. Пришлось разбираться с Marlin самостоятельно. Сначала с версии 1.1.6, (которая была исходно в принтере) переносил настройки в 1.1.9. Запустил с BL Touch, нормально печатал. Но захотелось большего. Решил попробовать 2 версию. Настроил, все работает. Опять захотелось большего. И вот тут как раз я и уперся в ограничение по памяти.

Опций в конфиге для отключения я больше не нашел. Лезть в сам код не хотелось. И тут мне в голову пришла банальная мысль: посмотреть как обстоят дела с настройками компилятора. Может там можно чего-нибудь сэкономить. Среду Arduino я иногда использую для всяких поделок на ESP8266 или ESP32, а вот AVR не пользуюсь со времен AT90S2313 и ATmega103. Как там сейчас обстоят дела с кодогенерацией не знаю. Попробовал включать разные опции и был удивлен. Можно выгадать прилично памяти программ с небольшой потерей производительности или даже с её улучшением.

Привожу небольшую табличку из того, что я пробовал. Цифры примерные, получены на прошивке Marlin 2.0.3 и Arduino 1.8.11

ОпцияРазмер Описание
-mcall-prologues3998Для функции пролога/эпилога будут использоваться подпрограммы. Для сложных функций, которые используют много регистров (состояние которых нужно сохранить/восстановить на входе/выходе функции), эта опция будет экономить некоторое количество памяти кода программ взамен на некоторое снижение быстродействия.
-Wl,–relax1112

По возможности использовать команды RJMP и RCALL вместо JMP и CALL. Это не только уменьшает код, но и ускоряет выполнение.

-fno-split-wide-types 408Отменить разделение регистров для типов, занимающих их несколько. Должно увеличивать код, но на практике уменьшает.
-finline-limit=3 190

По умолчанию компилятор ограничивает размер функций, которые могут быть встроены. Этот флаг позволяет управлять этим пределом для функций, которые являются явно помеченными как inline.

-fno-tree-scev-cprop48Векторизовать внешний цикл, если несколько циклов вложены друг в друга для уменьшения размера.

Чтобы добавить эти опции нужно создать файл:

<папка, где установлена среда Arduino>\hardware\arduino\avr\platform.local.txt

с содержимым:

compiler.c.extra_flags=-mcall-prologues -fno-tree-scev-cprop -fno-split-wide-types -finline-limit=3 compiler.cpp.extra_flags=-mcall-prologues -fno-tree-scev-cprop -fno-split-wide-types -finline-limit=3 compiler.c.elf.extra_flags=-Wl,--relax

Можно оставить только часть опций, если памяти уже хватает. Хотя я и не заметил никаких замедлений в работе принтера при включенных всех этих опциях.

PS. Я понимаю, что ничего нового не придумал и эти опции многие знали. Но вопрос об уменьшении размера кода здесь периодически всплывает, а такого решения мне не встречалось.

Подпишитесь на автора

Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых постах.

Отписаться от уведомлений вы всегда сможете в профиле автора.

20
Комментарии к статье

Комментарии

15.02.2020 в 06:48
0

Под Arduino AVR который использует GCC eще вот так можно:

#pragma GCC optimize ("Os") //code optimisation controls - "O2" & "O3" code performance, "Os" code size

Добавляется в главный *.ino  первой строчкой.

15.02.2020 в 12:16
0

Параметр "Os" и так уже есть в настройках в файле platform.txt

compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects
compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto 

В файл platform.local.txt добавляются дополнительные параметры.

15.02.2020 в 14:38
0

Самый большой жрун памяти и замедлятор быстродействия это телевизор 12864.

Экономия 12+КБ памяти, 200Б оперативы и около 70% процессорного времени на непересчёт и неперерисовку всех пикселей телевизора.

И это на стандартных опциях компилятора.

15.02.2020 в 15:39
0

Это само собой. Телевизор и еще, пожалуй, SD карта. Но без них локально печатать тоже никак. Указанный даунгрейд до текстового экрана как то не особо интересен. Если уж переделывать, так с улучшением. Остается внешний "принтсервер" в виде малинки или еще какого девайса.

Мне вот все не дает покоя такая нелогичность. Привода, драйверы, железки и т.п. на приличную сумму и слабенький проц для управления все этим. У меня вначале даже были мысли поставить в районе экрана какую-нибудь esp8266 или esp32 в разрыв линий управления плата <-> экран с энкодером. Marlin разделить на драйверную часть и высокоуровневую и организовать между ними обмен через эти линии. Тогда весь реалтайм по приводам и датчикам спокойно отрабатывала бы AVR-ка, а esp-ха сложную математику, интерфейс, карточку, WiFi. Стоимость апгрейда по деталям - копеечная. Правда преобразование 3в <-> 5в добавляют лишнего гемора. 

Чтобы прикинуть, насколько муторно разделение, надо глубоко погружаться в Marlin. У меня пока нет на это времени. Я пока все свободное время осваиваю саму печать.

15.02.2020 в 19:34
1

Мне вот все не дает покоя такая нелогичность. Привода, драйверы, железки и т.п. на приличную сумму и слабенький проц для управления все этим. 

Уже все "украдено" до нас.

Есть Klipper он поддерживает в том числе многопроцессорность, и всем рулит через малинку.

15.02.2020 в 21:58
0

Ну да, идея разделения лежит на поверхности. Я тогда еще не знал про Klipper, слышал, но думал это просто еще один вариант прошивки с "принт-сервером". Да и зациклился я как то на Marlin.

А сподвигло меня к мыслям о разделении два момента:
1) во 2-ой версии Marlin есть поддержка ESP32;
2) при беглом просмотре кода примерно нашел предполагаемую точку водораздела на части. Но это в одну сторону esp -> avr. А вот насколько там завязано обратное взаимодействие пока не ясно.

Но затея, честно говоря, не особо перспективная. Времени надо много, если и получится, то под следующую версию Marlin надо будет опять переделывать. Если бы такое разделение штатно было, вот это было бы здорово. А так проще нормальную плату купить.

15.02.2020 в 16:29
0

Спасибо. Попробовал скомпилировать Marlin 1.1.9.

Было:

Sketch uses 127282 bytes (97%) of program storage space. Maximum is 130048 bytes.
Global variables use 4627 bytes (28%) of dynamic memory, leaving 11757 bytes for local variables. Maximum is 16384 bytes.

Стало:

Sketch uses 121818 bytes (93%) of program storage space. Maximum is 130048 bytes.
Global variables use 4627 bytes (28%) of dynamic memory, leaving 11757 bytes for local variables. Maximum is 16384 bytes.

Поэтому попробовал включить EEPROM (отключил, чтобы влезло все, что хотелось). Получилось:

Sketch uses 128304 bytes (98%) of program storage space. Maximum is 130048 bytes.
Global variables use 4761 bytes (29%) of dynamic memory, leaving 11623 bytes for local variables. Maximum is 16384 bytes.

15.02.2020 в 18:44

Комментарий удалён

15.02.2020 в 22:31
0

А для stm32 и vscode как сие провернуть?)

16.02.2020 в 11:25
0

Я, конечно, не уверен, но думаю проблем в реализации мое предложение не вызовет.

Как насчет того, чтобы купить и просто перепаять микросхему EEPROM на более ёмкую. Как я понимаю, у вас микросхема 128 кБ, купите 256 кБ и пользуйтесь на здоровье. По моему это самый простой выход.

П.С. Если я не прав - гуру электроники поправьте меня. :)

16.02.2020 в 14:39
0

Только вот там нет отдельной «микросхемы EEPROM». Плату придётся перепероектировать заново, под новый микроконтроллер.

17.02.2020 в 02:03
0

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

Я поменял плату, чем в итоге очень доволен. 

17.02.2020 в 02:01
0

Тоже сначала игрался со стоковой платой, даже тихие драйвера на нее хотел перепаять. В итоге купил skr1,3 с 2208 драйверами и управлением по сом порту ( перемычки на плате, без колхозинга). Ну и 3д тач 9 точек по стеклу🤣перед каждой печатью.  Марлин 2,0 Результатом доволен, теперь учусь работать с пластиком.

Ендер3 про.

Для написания комментариев, пожалуйста, авторизуйтесь.

Читайте в блогах

Исследуем точность и границы возможностей фотополимерного принтера VS FDM

Вчера печатали собор Святого Павла, посмотрите что получилось

Языческий храм Гарни в Армении (есть польза от самоизоляции, хоть какая-то)

LCD2004 на RepRapFirmware

Мастерская «Svetoten»

Самодельная дельта - часть 3. DeltaCube. Такие ошибки допускать нельзя!