Chcę zrobić szkic tak mały, jak to możliwe, do celów testowych. Problem polega na tym, że kiedy kompiluję szkic BareMinimum (z pustą konfiguracją i pętlą), otrzymuję 466 bajtów dla Uno i ogromną 4,242 dla Leonardo. Czy jest jakiś sposób na napisanie własnego kodu, który nie ma żadnych dodatkowych funkcji (mianowicie Timer0 dla millis()
i delay()
). Chciałbym również móc wyłączyć funkcje klawiatury / myszy dla Leonardo.
programming
sketch
arduino-leonardo
Doktor
źródło
źródło
Odpowiedzi:
Powinieneś być w stanie stworzyć własną definicję planszy za pomocą niestandardowego pliku deski.txt zgodnie z https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification . Jak widzę, definicja Leonarda zawiera kilka funkcji USB. Mam nadzieję, że włączenie kompilacji 4K opiera się na tych flagach, a nie na typie procesora.
Tam, gdzie deski.txt użyłyby uploadu, sekcje bootloadera z Leonardo i kompilacji z uno.
Wszystko to przy założeniu, że kompilacja biblioteki podstawowej nie używa flag specyficznych dla procesora do włączenia funkcji USB.
Jeśli dostaniesz taką pracę. napisz z powrotem, jestem pewien, że inni byliby zainteresowani takimi.
Niedawno natknąłem się na to ograniczenie 4K w wersji demonstracyjnej biblioteki, która faktycznie zmaksymalizowała UNO i musiałam ją zainstalować
wokół dużej części dodatkowych elementów szkicu, które pasują do Leonarda.
Założyłem (błędnie), że to 4K było, ponieważ nadal zawierałem Serial.print, który po USB CDC na Leo. Ale widzę, że po zrzutie pamięci pustego szkicu wciąż tam są.
Co ma sens. Ponieważ Leonardo nadal wymaga klienta USB-CDC (4K), aby wykryć połączenie 1200 Baud z AVR-DUDE, aby udaremnić zdalny restart.
Stąd tworzenie niestandardowego pliku board.txt bez USB w kompilacji również musi mieć
oddalony.
Po załadowaniu do celu wymagałoby to synchronizacji przesyłania z ręcznym resetowaniem celu. Ponieważ utracono możliwość zdalnego restartu.
źródło
Niedawno chciałem to dokładnie zrobić. Ponieważ nie ma na to przyjemnego sposobu, skończyło się na napisaniu łatki do wtyczki Stard sardime-text arduino, aby dokładnie to zrobić. Zostało to następnie zaakceptowane, więc powinno być w każdej aktualnej instalacji Stino.
Dodaje to nową opcję do Stino:
Korzystanie z tego trybu daje wyniki kompilacji takie jak następujące:
W przypadku Uno:
Dla Leonarda
Właściwie programowania Leonardo z powyższym skompilowanej wyjścia jest prawdopodobnie zły pomysł, ponieważ może przerwać funkcję auto-reset, ale mógłby , gdyby chciał. Porada dla mpflagi za zwrócenie uwagi na to w swojej odpowiedzi.
Pamiętaj, że raporty pamięci są w rzeczywistości niepoprawne, ale to osobny problem .
Kod użyty do powyższego to:
Niektóre uwagi:
milis()
lub podobne.#include <Arduino.h>
.main
. Nigdy nie wracasz zmain
. Jeśli chcesz skonfigurować rzeczy, dzieje się to przedwhile (1)
.źródło
Chociaż zależy to od szkicu, możesz nieco zmniejszyć rozmiar, ponownie wykorzystując kod metodami.
Weź ten kod:
1 322 bajty na Arduino Uno. Teraz zmniejszmy to trochę:
1194 bajty. To około 10% mniej!
W każdym razie, chociaż nie zmniejsza to w znacznym stopniu szkicu, czasem może być najłatwiejszą drogą, gdy masz dwa bajty ponad limit lub po prostu chcesz stworzyć bardziej kompaktowy szkic na początku, nie tracąc żadnej funkcjonalności. Nie jest tak w każdej sytuacji, ale czasem uważam ją za przydatną.
źródło
@ pingwin pingwinowy, na pewno możemy Chociaż kod kompiluje się w 1180 bajtów flash + 13 bajtów RAM dla Uno na moim komputerze, możemy to poprawić :) więc wyzwanie golfa zaakceptowane i kilka przydatnych wskazówek, ponieważ jesteśmy w branży uczenie się.
Krok 1: zmniejsz wymagania zmienne. Używanie int dla portu ledowego wydaje się nieco przesadne, z pewnością nie mamy 65535 adresowalnych portów IO na arduino :) Więc zmieniamy go na bajt tylko dla zabawy. Później zmienimy to na #define, ale aby pokazać wpływ używania zbyt dużych typów zmiennych.
Kompiluje do 1172 bajtów + 13 bajtów RAM. Oszczędza to 8 bajtów pamięci flash z powodu mniejszej liczby wymaganych operacji dla bajtu zamiast liczby całkowitej. Spodziewałbym się 12 bajtów pamięci RAM, ale dobrze. Nie tak bardzo, ale każdy zapisany bajt jest dobry.
Krok 2: zmień zmienną na definiuje, kiedy ma to sens. Na przykład bajt led nie jest potrzebny, szpilka sama się nie wylutuje.
Kompiluje do 1142 bajtów flash + 11 bajtów pamięci RAM. Zapisano już 38 bajtów. Wynika to z mniejszej liczby operacji rejestru wymaganych do pobrania wartości int. Zapisaliśmy również 2 bajty z pamięci RAM. (wciąż zastanawiam się, dlaczego bajt nie skompilował się w 1 mniej bajtu pamięci RAM .....)
Krok 3: zoptymalizuj kod. Widzę 2 opóźnienia. Zastanawiam się, czy zmienię to na 1 opóźnienie, by zaoszczędzić miejsce, ale muszę obliczyć wartość kołka LED i przełączyć go (odwrócić). Możemy to zrobić za pomocą digitalRead (), ale czy pozwoli to zaoszczędzić miejsce?
Kompiluje do 1134 bajtów + 11 bajtów ram. Tak! kolejne 8 bajtów. To daje w sumie 46 bajtów i 2 mniej wierszy kodu.
Kolejna ogólna wskazówka dotycząca zmniejszania rozmiaru kodu. Nie używaj klasy String. Jest OGROMNY, dowiedz się, jak radzić sobie z tablicami znaków, strcpy (), strcmp (). Jeśli masz tylko kilka podstawowych operacji na łańcuchach, użycie klasy String powoduje głównie marnowanie miejsca zarówno na pamięć flash, jak i pamięć RAM.
źródło