[avr] zerowanie ram-u

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ł

Reply to
pv
Loading thread data ...

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.

Reply to
T.M.F.

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ć).

Reply to
pv

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.

Reply to
T.M.F.

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.

Reply to
BartekK

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

Reply to
pv

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/

Reply to
Virus_7

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.

Reply to
Adam Dybkowski

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.

Reply to
J.F.

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.

Reply to
T.M.F.

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

J.

Reply to
J.F.

Chyba istotnie masz racje.

Reply to
T.M.F.

Dziękuję za odpowiedzi

Reply to
pv

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.