czech_w napisał(a):
Czyli tak mogę zarezerwować pamięć powiedzmy dynamicznie jak rozumiem. Ponieważ po kompilacji samej zmiennej(stałej) k1[25] mam Data: 0 Bytes a przy kompilacji k1[25] i k6 mam Data 26 Bytes.
Chyba nie bardzo rozumiesz. Do dynamicznej alokacji pamięci służą np. funkcje
malloc() i
free() z biblioteki standardowej
stdlib.h. Linijka
char k1[25]; ma na celu po prostu zarezerwowanie 25 bajtów RAM na tablicę o nazwie
k1. Miejsce, w którym zostanie tablica ulokowana (w sekcji
.data,
.bss czy na stosie) jest zależne od sposobu i miejsca zdefiniowania zmiennej.
Na wskazaniach zajętości pamięci obliczanych przez program
avr-size zbytnio bym nie polegał. W tym przypadku zmienna (tablica) k1 zostanie najprawdopodobniej umieszczona przez kompilator na stosie, a stos nie jest uwzględniany przez
avr-size. Gdybyś zdefiniował ją globalnie, wtedy zapewne zostałaby wliczona w zajętość RAM (w sekcji
.bss, kiedy nie jest zainicjowana żadną wartością).
W tym przypadku problem polegał głównie na nieprawidłowym definiowaniu tablic, a właściwie braku ich definicji. Prawidłowe zdefiniowanie tablice powinno wyglądać tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
To co zrobiłeś natomiast wygląda tak:
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Oczywiście w procesie optymalizacji kompilator może np. pewne zmienne usunąć, więc nie zawsze będzie dokładnie tak, jak to opisałem powyżej, niemniej tak kompilator interpretuje intencje programisty.
Podejrzewam, że w trakcie kompilacji otrzymałeś od kompilatora warning o niezainicjowanym wskaźniku, który najprawdopodobniej zignorowałeś.
Dodatkowo kod jest tak nieoptymalny, że osobiście nie napisałbym w ten sposób programu nawet mając do dyspozycji kilka KiB RAM. Używanie 25 bajtów RAM dla zmiennej mieszczącej się w czterech bajtach, tym bardziej kiedy nie jest to uzasadnione uzyskaniem jakiejś innej korzyści (np. w postaci szybkości wykonywania kodu), nigdy nie jest dobrą praktyką. To samo zresztą dotyczy np. używania w pętli wykonującej się kilka razy iteratora 16-bitowego. No ale to temat poboczny, więc nie będę się tu nad nim zbytnio rozwodził
