"Впихнуть невпихуемое" или как найти место для нужных опций Marlin, если все ненужные уже отключены.
Помните рассказ "История одного байта"? Мне тоже не хватало нескольких байт. Всё ненужное и не очень нужное было уже отключено. Конфиги 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-prologues | 3998 | Для функции пролога/эпилога будут использоваться подпрограммы. Для сложных функций, которые используют много регистров (состояние которых нужно сохранить/восстановить на входе/выходе функции), эта опция будет экономить некоторое количество памяти кода программ взамен на некоторое снижение быстродействия. |
-Wl,–relax | 1112 | По возможности использовать команды RJMP и RCALL вместо JMP и CALL. Это не только уменьшает код, но и ускоряет выполнение. |
-fno-split-wide-types | 408 | Отменить разделение регистров для типов, занимающих их несколько. Должно увеличивать код, но на практике уменьшает. |
-finline-limit=3 | 190 | По умолчанию компилятор ограничивает размер функций, которые могут быть встроены. Этот флаг позволяет управлять этим пределом для функций, которые являются явно помеченными как inline. |
-fno-tree-scev-cprop | 48 | Векторизовать внешний цикл, если несколько циклов вложены друг в друга для уменьшения размера. |
Чтобы добавить эти опции нужно создать файл:
<папка, где установлена среда 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. Я понимаю, что ничего нового не придумал и эти опции многие знали. Но вопрос об уменьшении размера кода здесь периодически всплывает, а такого решения мне не встречалось.
Еще больше интересных статей
Быстрая печать ажурных стенок в Ultimaker Cura
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Апгрейды для Sprite Extruder Ender 3: обдув K3D, азотированные шестерни FYSETC Sprite Extruder Gear, сопло 0.6. Печать композитами.
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Всем привет! )
Я знаю, что сейчас не 202...
Сопла и сопли
Подпишитесь на автора
Подпишитесь на автора, если вам нравятся его публикации. Тогда вы будете получать уведомления о его новых статьях.
Отписаться от уведомлений вы всегда сможете в профиле автора.
Сколько раз этот вопрос поднимался. Сколько тем...
Комментарии и вопросы
Может я и ошибаюсь, сейчас не....
Тут хаос в чистом виде, а Авто...
Да, видимо просто для примера....
Принтер при печати просто в ка...
Добрый день! Подскажите пожалу...
Принтер Wanhao D9 500Пластик P...
Здравствуйте. При печати кубик...