Kompilacja firmware z optymalizacją prędkości

Garreth
Posty: 978
Rejestracja: 20 kwie 2016, 6:59
Lokalizacja: Katowice
Kontaktowanie:

Kompilacja firmware z optymalizacją prędkości

Postautor: Garreth » 21 maja 2016, 7:42

Temat wałkuję już od dłuższego czasu na swojej drukarce, plus ostatnio testowałem to na zestawie składającym się z Arduino i wyświetlacza podpiętego przez SPI i ewekty są baaardzo zadowalające. Mogę kręcić enkoderem z rozsądną prędkością w trakcie rysowania łuków oraz z szaloną prędkością podczas prostych bez przycinek.

Małe ostrzeżenie - istnieje szansa, że użycie agresywnej optymalizacji szybkości kodu coś popsuje. Prawdopodobieństwo jest niewielkie, bo domyślna flaga optymalizacyjna -Os jest już sama w sobie agresywna, ale należy trochę poobserwować drukarkę czy się czasem nie gubi podczas druku (to znaczy polecam wydruk małej figurki z thingiverse po wrzuceniu firmware i sprawdzenie czy jest ok, a nie od razu 30 godzinny wydruk:) ). W marlinie trzymam tę flagę od długiego już czasu, w tym na różnych wersjach marlina i nic złego się nie dzieje.

Mamy 5 flag: -Os (domyślna), -O0 (brak optymalizacji), -O1, -O2, -O3, przy czym największa różnica w szybkości jest widoczna już przy fladze -O2, ale flaga -O3 jest jeszcze ciut szybsza. Jest jedna zasada "coś za coś" - czym szybszy kod, tym więcej potrzebuje pamięci flash.

Polecam przekompilować soft z flagą O3, i spojrzeć w wyniku kompilacji czy Arduino IDE nie wyrzuciło ostrzeżenia albo błędu o niewystarczającej ilości flash, to możemy się cofnąć o jeden krok i przekompilować z -O2. Co prawda jak ktoś chce i mu nie przeszkadza warning, a soft się dalej mieści w arduino to niech wrzuca -O3 :)

No dobra, koniec mojego marudzenia, teraz kwestia jak to zrobić:

1. Kompilujemy swój soft na domyślnych ustawieniach i spisujemy do notatnika wynik kompilacji (ilość zajętej pamięci). Potrzebne to będzie w celu weryfikacji, czy dobrze ustawiliśmy flagę - jeśli poprawnie to rozmiar zajętej pamięci się wyraźnie zwiększy.
2. Odnajdujemy plik platform.txt... to może być skomplikowane bo w różnych poradnikach wskazywane jest różne miejsca, ale generalnie szukamy miejsca gdzie znajduje się Arduino.exe (miejsce instalacji środowiska, u mnie C:\Program Files (x86)\Arduino\) i wchodzimy do podfolderu hardware\arduino\avr\. U mnie pełna ścieżka wygląda tak:

Kod: Zaznacz cały

C:\Program Files (x86)\Arduino\hardware\arduino\avr\platform.txt

3. Otwieramy plik w czymś lepszym niż zwykły notatnik, bo inaczej linie będą zlepione w całość (Notepad++ rządzi) i zmieniamy wszystkie 3 wystąpienia flagi -Os na -O3 (numery linii u mnie, u każdego mogą być inne, ale w tych okolicach:

Kod: Zaznacz cały

Linia 23: compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-section
Linia 26: compiler.c.elf.flags={compiler.warning_flags} -Os -Wl,--gc-sections
Linia 30: compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD

Zmieniamy na:

Kod: Zaznacz cały

Linia 23: compiler.c.flags=-c -g -O3 {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-section
Linia 26: compiler.c.elf.flags={compiler.warning_flags} -O3 -Wl,--gc-sections
Linia 30: compiler.cpp.flags=-c -g -O3 {compiler.warning_flags} -std=gnu++11 -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD


4. Plik zapisujemy i restartujemy Arduino IDE
5. Kompilujemy ponownie firmware i porównujemy rozmiar zajętości pamięci. Jeśli się zwiększył i nie ma błędu braku pamięci to podgrywamy. Jeśli się nie zmienił, zedytowaliśmy zły plik (albo nie zapisaliśmy zmian, albo nie zrestartowaliśmy arduino IDE). Jeśli jest błąd braku pamięci to zmieniamy flagę na -O2. Jeśli jest ostrzeżenie o braku pamięci to decydujemy sami czy wgrywać czy zmienić na -O2.


Zmiana w platform.txt będzie dotyczyła wszystkich naszych płytek z arduino, także należy o tym pamiętać jeśli ktoś po wrzuceniu firmware w Mega, będzie próbował upchnąć jakiś obszerny kod do jakiegoś arduino nano/mini/micro czy innego cuda. Choć i w innych zastosowaniach, zwłaszcza z wyświetlaczami, zmiana ta jest dość korzystna: viewtopic.php?p=2552#p2552 viewtopic.php?p=2403#p2403 .

Dajcie proszę znać czy wszystko jasno opisałem i przede wszystkim, czy zmiana przyniosła u Was jakieś korzyści:)

Awatar użytkownika
Kopytko
Posty: 964
Rejestracja: 19 kwie 2016, 17:04
Lokalizacja: Oleśnica
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: Kopytko » 21 maja 2016, 8:57

dZIĘKUJĘ BARDZO ZA WYTŁUMACZENIE, PRZETESTUJE W PRZYSZŁYM TYGODNIU, W PONIEDZIAŁEK PRZEPROWADZKA I DRUKARKI JUŻ POPAKOWANE:(
Przepraszam za duze nie zauważyłem capslocka
:arrow: Pozdrawiam Patryk.

Awatar użytkownika
g4ever
Posty: 430
Rejestracja: 19 kwie 2016, 21:47
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: g4ever » 21 maja 2016, 12:01

Czyli zmiana flagi na O2 pomoże z zacinającym się wyświetlaczem i jeszcze do tego poprawi wydajność co zaowocuje brakiem zacinania się głowicy? Czy tylko pomoże z wyświetlaczem?

Garreth
Posty: 978
Rejestracja: 20 kwie 2016, 6:59
Lokalizacja: Katowice
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: Garreth » 21 maja 2016, 12:05

Flaga O2 czy O3 sprawią, że kod w procku będzie się szybciej wykonywać. Na pewno pomaga to z wyświetlaczem u mnie, co do zacinania się nie jestem w stanie przewidzieć, musisz przetestować (mam 2xDRV8825 i 2xTMC2100, wcześniej miałem 4 DRV8825, wszystkie na 32 mikrokrokach i śmigało zawsze bez przycinek).


Awatar użytkownika
g4ever
Posty: 430
Rejestracja: 19 kwie 2016, 21:47
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: g4ever » 21 maja 2016, 13:14

A na repetierze to działa?

bo mam dla O2 od razu przy weryfikacji błędy a dla O3 weryfikacja ok ale przy ładowaniu:

Kod: Zaznacz cały

Szkic używa 156 866 bajtów z (61%) pamięci programu. Maksimum to 253 952 bajtów.
Globalne zmienne używają 4 382 bajtów z (53%) dynamicznej pamięci, pozostawiając 3 810 bajtów dla lokalnych zmiennch. Maksimum to  8 192 bajtów.

avrdude: stk500v2_setparm(): failed to set parameter 0x9e
avrdude: stk500v2_command(): unknown status 0xc8
avrdude: initialization failed, rc=-1
         Double check connections and try again, or use -F to override
         this check.

avrdude: stk500v2_command(): unknown status 0x01
avrdude: stk500v2_disable(): failed to leave programming mode

mcexperts
Posty: 588
Rejestracja: 19 kwie 2016, 18:40
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: mcexperts » 21 maja 2016, 13:17

Nie widzi ci plytki.

Garreth
Posty: 978
Rejestracja: 20 kwie 2016, 6:59
Lokalizacja: Katowice
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: Garreth » 21 maja 2016, 13:58

Podeślij mi Twój firmware na którym testujesz, wrzuce u siebie na świeże arduino MEGA i spróbuję przekompilować na O2 i O3, może to coś "u Ciebie". Choć O3 przeszło, więc nie wiem dlaczego O2 by nie miało, wrzucanie na płytkę to osobny problem i raczej nie ma jak być związany z samą kompilacją.

Awatar użytkownika
g4ever
Posty: 430
Rejestracja: 19 kwie 2016, 21:47
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: g4ever » 21 maja 2016, 17:50

rzeczywiście był problem z "widocznością" płytki, zmieniłem komputer i udało się wgrać z O3, ale wydruk na 60 mm obrys zewnętrzny dalej robi bloby niestety... za chwile spróbuje jeszcze zmniejszyć prędkość przy obrysie zewnętrznym, potem to już zmiana na 1/16 lub wymiana elektronika na 32bity

Garreth
Posty: 978
Rejestracja: 20 kwie 2016, 6:59
Lokalizacja: Katowice
Kontaktowanie:

Re: Kompilacja firmware z optymalizacją prędkości

Postautor: Garreth » 21 maja 2016, 17:56

No to niestety, musisz powalczyć dalej. Ale dobrze, że się udało skompilować, przynajmniej wiadomo, że repetier nie używa jakiś dziwnych funkcji, które by przeszkodziły kompilacji.


Wróć do „Firmware”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 2 gości