[avr] zerowanie ram-u

Jan 24, 2007 12 Replies

Czy jest jakaś funkcja w avr-gcc do wyzerowania pamięci ram po resecie ? W Franklin C 8051 widziałem coś takiego:



CLR A MOV R0, #7F



002C: MOV @R0, A DJNZ R0, 002C

Jak zrobić coś takiego na ram-ie AVR (attiny2313) w avr-gcc ? W dokumentacji attiny znalazłem tylko informację o automatycznym ustawianiu początkowych wartości do I/O registers po resecie. Przeglądałem avr-libc-user-manual, ale nic nie znalazłem.



Dziękuję. Paweł


Napisz lepiej co chcesz osiagnac, latwiej bedzie cos doradzic. Zawsze mozesz myknac wlasna sekcje .init w ktorej bedziesz zerowal SRAM po starcie programu. Albo ustawic pointer na poczatek SRAM i za pomoca memcpy wyzerowac, z tym, ze na bank wykrzaczysz w ten sposob program.

Chcę po prostu wyzerować wszystkie zmienne. Nie chcę pisać w main, na początku:

zmienna1 = 0 zmienna2 = 0 itd.

Jeśli zmiennych jest np. 50 to tracę niepotrzebnie pamięć programu (chyba przynajmniej ze 100 bajtów), żeby je na początku (po resecie) zainicjować (wyzerować).

Niekoniecznie, moze kompilator to sam zoptymalizuje. Jesli jestes pewien, ze zmienne sa umieszczone kolejno w pamieci to najprosciej ustawic wskaznik na pierwsza z nich i za pomoca memset wpisac 0 w obszar pamieci zajmujacy tyle ile twoje zmienne. IMHO to ryzykowne, chyba, ze to ma byc tablica.

pv napisał(a):

Zobacz w kod wynikowy asm kompilacji, zauważ że na początku wcale nie ma zerowania po kolei wszystkich komórek na zmienne (przeważnie, zalezy jaka optymalizacja i co jest dalej). Jesli kompilator znajduje najpierw podstawianie czegos pod dana zmienna, nim znajdzie jakiekolwiek jej uzycie - to nie zeruje/inicjuje jej, bo wie ze zostanie wypelniona wartoscia (np obliczona w trakcie dzialania programu). Jesli masz zmienna ktora "od razu" jest do czegos pobierana jako parametr - to jest zerowana.

Zrobi=B3em eksperyment - jednak zeruje. Utworzy=B3em 13 zmiennych unsigned char (w pami=EAci przyporz=B1dkowa=B3 to: 0x60 - 0x6C) i kasuje (zeruje) te 13 zmiennych na pocz=B1tku:

CLR R1 =2E.. =2E.. ST X+,R1 Store indirect and postincrement CPI R26,0x6D Compare with immediate CPC R27,R17 Compare with carry BRNE PC-0x03 Branch if not equal

pv napisa³(a):

A jest jaki¶ sposób, ¿eby tej pamiêci nie zerowa³? W BASCOMie niby jest... :P

-- __ ___ * Pozdrawiam * ____ \ \ / (_)_ _ _ _ ___ |__ | mailto://rot13.ivehf snipped-for-privacy@b2.cy/ \ V /| | '_| || (_-< ___ / /

formatting link
\_/ |_|_| \_,_/__/|___|/_/ gg://2812776/

pv napisał(a):

Biblioteka standardowa dołączana do każdego programu kompilowanego w avr-gcc automatycznie zeruje całą sekcję zmiennych (.bss) przed skokiem do funkcji main. Jest to opisane w dokumentacji.

Hm, standard C niby zaklada ze wszystkie zmienne statyczne beda wyzerowane, wiec moze robi .. ale w praktyce to po co ci to ?

Tym co naprawde musza byc wyzerowane nadaj jawny inicjator, reszta nie powinna ci przeszkadzac.

J.

Wydaje mi sie, ze w standardzie jezyka nie jest zagwarantowane zerowanie zmiennych statycznych niezainicjowanych, np. static int zmienna; wcale nie musi byc zainicjowana na 0. AVR-gcc akurat tak robi, ale bazowanie na tym chyba nie jest dobrym pomyslem.

Jesli mnie pamiec nie myli to wlasnie musi, tzn standard tak wymaga. Lekka glupota, ale coz ..

J.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required