squelch napisał: Dynamiczna alokacja jest po to aby na sztywno nie rezerwować całego obszaru LCD tylko w zależności od potrzeb, jak ci się nie podoba rezerwacja dynamiczna powołaj tablice jako globalna i przekazuj funkcji. Ja nie narzekam na kod wszystko się fajnie analizuje.
Dodano po 56 [sekundy]:
czyli jak dam +1 to też zadziała?
Dodano po 15 [minuty]:
A jeszcze jedna sprawa czy linia która sprawdza czy już zakończyliśmy wysyłać bufor tj.
Zaloguj się, aby zobaczyć kod
czy jest poprawna przecież seq.pos idzie od 0 .A w kodzie len inicjalizujemy tak
Zaloguj się, aby zobaczyć kod
co daje długość tekstu do której dodajemy 1 według mnie powinno być bez tego +1 bo i tak seq.pos liczy od zera czyli np. jak tekst ma trzy znaki to seq.pos przyjmuje takie wartości 0,1,2,3 czyli 4 indeksy bufora oblecimy, 3 tekst + 1pozycja, a dodając jeden to według mnie ale nie sprawdzałem jeszcze ostatni znak może być dziwny.
+2 jest dlatego, że potrzebujemy jeden bajt na NUL i jeden bajt na pozycję wyświetlanego tekstu. Ponieważ data[0] zawiera pozycję (adres w GRAM), więc znaki są indeksowane od 1, a nie od 0.
Dodano po 10 [minuty]: BlueDraco napisał: Dynamiczna alokacja w tym przypadku to:
- min. 4 dodatkowe bajty pamięci RAM przy każdej alokacji
- zbędny narzut czasu na alokację i dealokację
- zbędna zajętość pamięci ROM na procedury alokacji i dealokacji
- niebezpieczeństwo wycieków w przypadku błędów w programie
Biorąc pod uwagę, że mamy kilka transakci max. to strata 4 bajtów/transakcję rzeczywiście poraża. Podobnie strata czasu - ile razy na sekundę piszemy na LCD?
Poza tym nie zauważyłeś, że funkcje są napisane tak, że można użyć alokacji statycznej, jeśli to kogoś boli, co załatwia kolejne punkty.
Niebezpieczeństwo wycieków, przy poprawnie napisanej aplikacji nie istnieje, równie dobrze możnaby napisać po co np. RTOS, przecież tyle pułapek się w nim czai...
BlueDraco napisał: Wyświetlacz ma stały rozmiar, np. 2 x 16 znaków. Wystarczy jeden raz zadeklarować strukturę danych zawierającą miejsce na zawartość wyświetlacza. Zwróć uwagę, że jeśli masz na wyświetlaczu np. całą linijkę 16 znaków, to żeby ją zmienić na krótszy komunikat, musisz wyświetlić słowo komunikatu i dalej spacje - do 16 znaków. Dlatego najprostsza i najszybsza obsługa wyświetlacza polega na zapisie do pamięci całej zawartości wyświetlacza, a następnie wywołania aktualizacji całego wyświetlacza (np. przy użyciu przerwania timera). nie ma sensu pisanei "po kawałku" - zajmuje więcej czasu i wymaga dodatkowych poleceń.
Nie do końca tak jest. Masz 80 bajtów GRAM, które musiałbyś zaalokować statycznie. Przy alokacji dynamicznej pamięć zajmowana jest tylko chwilowo, a same transakcje też zajmą jej mniej. Nic nie stoi na przeszkodzie, aby dodać obsługę dodatkowych poleceń, korzystając ze znaków o kodach 0-31 - np. wyczyść ekran lub linię. Przy LCD graficznych jest jeszcze gorzej jeśli chcielibyśmy stworzyć bufor. Oczywiście nie znaczy to, że istnieje tylko jedno rozwiązanie problemu. Podane kody są przykładami z książki mającymi ilustrować pewne techniki rozwiązywania problemów. Rozwiązanie ze stworzeniem pamięci shadow dla GRAM też jest pokazane.