Optymalizacja
Programowanie niskopoziomowe dla systemów wbudowanych różni się zupełnie od programowania dla urządzeń ogólnego przeznaczenia, takich jak komputery i telefony komórkowe. Wydajność (pod względem prędkości i przestrzeni) jest znacznie ważniejsza, ponieważ zasoby są na wagę złota. Oznacza to, że pierwszą rzeczą do zrobienia, jeśli zabraknie Ci miejsca, jest sprawdzenie, które części kodu możesz zoptymalizować.
Jeśli chodzi o zmniejszenie wykorzystania przestrzeni programowej (Flash), rozmiar kodu może być dość trudny do optymalizacji, jeśli nie masz doświadczenia lub jeśli jesteś bardziej przyzwyczajony do programowania na komputerach stacjonarnych, które zwykle nie potrzebują tej umiejętności. Niestety, nie istnieje podejście oparte na „magicznej kuli”, które działałoby we wszystkich sytuacjach, chociaż pomaga, jeśli poważnie zastanawiasz się, co naprawdę musi mieć szkic . Jeśli funkcja nie jest potrzebna, wyjmij ją.
Czasami pomocne jest również określenie, gdzie wiele części kodu jest takich samych (lub bardzo podobnych). Możesz je skondensować w funkcje wielokrotnego użytku, które można wywoływać z wielu miejsc. Należy jednak pamiętać, że czasami próba uczynienia kodu zbyt wielokrotnego użytku w rzeczywistości powoduje, że jest on bardziej szczegółowy. Jest to trudna równowaga do uderzenia, która zwykle towarzyszy ćwiczeniom. Pomocne może być poświęcenie czasu na sprawdzenie, jak zmiany kodu wpływają na dane wyjściowe kompilatora.
Optymalizacja danych wykonawczych (SRAM) jest nieco łatwiejsza, gdy się do tego przyzwyczaisz. Bardzo częstym problemem dla początkujących programistów jest używanie zbyt dużej ilości danych globalnych. Wszystko zadeklarowane w zasięgu globalnym będzie istniało przez cały okres istnienia szkicu, i to nie zawsze jest konieczne. Jeśli zmienna jest używana tylko w obrębie jednej funkcji i nie musi trwać między wywołaniami, należy uczynić ją zmienną lokalną. Jeśli wartość musi być dzielona między funkcje, zastanów się, czy możesz przekazać ją jako parametr zamiast uczynić ją globalną. W ten sposób będziesz używał SRAM dla tych zmiennych tylko wtedy, gdy ich potrzebujesz.
Kolejnym zabójcą używanym przez SRAM jest przetwarzanie tekstu (np. Używanie String
klasy). Ogólnie rzecz biorąc, w miarę możliwości należy unikać wykonywania operacji na łańcuchach. To ogromne wieprze pamięci. Na przykład, jeśli wysyłasz dużo tekstu do numeru seryjnego, użyj wielu wywołań Serial.print()
zamiast zamiast konkatenacji ciągów. Spróbuj również zmniejszyć liczbę literałów łańcuchowych w kodzie, jeśli to możliwe.
Jeśli to możliwe, unikaj rekurencji. Za każdym razem, gdy wykonuje się wywołanie rekurencyjne, poziom stosu jest wyższy. Zamiast tego przekształć swoje funkcje rekurencyjne na iteracyjne.
Użyj EEPROM
EEPROM służy do długoterminowego przechowywania rzeczy, które zmieniają się tylko sporadycznie. Jeśli potrzebujesz użyć dużych list lub tabel przeglądowych stałych danych, rozważ wcześniejsze zapisanie ich w EEPROM i wyciąganie tylko tego, czego potrzebujesz.
Oczywiście pamięć EEPROM ma jednak dość ograniczony rozmiar i prędkość oraz ma ograniczoną liczbę cykli zapisu. Nie jest to świetne rozwiązanie dla ograniczeń danych, ale może wystarczyć, aby zmniejszyć obciążenie pamięci Flash lub SRAM. Jest również całkiem możliwe połączenie z podobną pamięcią zewnętrzną, taką jak karta SD.
Rozszerzenie
Jeśli wyczerpałeś wszystkie inne opcje, rozszerzenie może być możliwe. Niestety, rozszerzenie pamięci Flash w celu zwiększenia przestrzeni programu nie jest możliwe. Jednakże, to jest możliwe, aby rozwinąć SRAM. Oznacza to, że możesz być w stanie zmienić swój szkic, aby zmniejszyć rozmiar kodu kosztem zwiększenia rozmiaru danych.
Zdobywanie większej ilości pamięci SRAM jest w rzeczywistości dość proste. Jedną z opcji jest użycie jednego lub więcej układów 23K256 . Są one dostępne za pośrednictwem SPI, a biblioteka SpiRAM pomaga ci z nich korzystać. Uważaj tylko, że działają przy napięciu 3,3 V, a nie 5 V.
Jeśli używasz Mega, możesz alternatywnie uzyskać tarcze rozszerzające SRAM od Lagrangian Point lub Rugged Circuits .