Металл2024 Реклама
Метобр2024 Реклама

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

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

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

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

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

22
Статья относится к принтерам:
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. Я понимаю, что ничего нового не придумал и эти опции многие знали. Но вопрос об уменьшении размера кода здесь периодически всплывает, а такого решения мне не встречалось.

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

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

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

22
Комментарии к статье
Кремень КБ Реклама
Кремень КМ Реклама