AVR GCC zmienne globalne

May 26, 2004 5 Replies

Pytanie z innej beczki, Jak zadeklarowac zmienne globalne, ale zeby nie byly zerowane, poniewaz na samym poczatku odtwarzam ich wartosci z eepromu ...


U¿ytkownik "Pawe³ Kurzawa" snipped-for-privacy@kpw.qs.pl> napisa³ w wiadomo¶ci news:c92dr8$q2a$ snipped-for-privacy@nemesis.news.tpi.pl...

ale odtwarzasz je zanim wywola sie main() ?

bo jesli odtwarzasz je z eeproma na poczatku maina to nic juz ich nie wyzeruje

poza tym zmienne niezainicjowane chyba nie sa zerowane (sekcja .bss)

w main().

wlasnie zalezy mi na tym zeby pominac automatyczne funkcje inicjowania bo po co ma byc najpierw zerowana a potem odtwarzana przeze mnie ... szkoda czasu i zbednego kodu...

static sa zawsze inicjowane (zerowane) na samym poczatku ...

a moze ponizsza deklaracja bedzie OK?

static u08 seek __attribute__ ((section (".noinit")));

IMO zupełnie niepotrzebnie tracisz czas na zabawę z tym problemem. Zazwyczaj kod "startowy" aplikacji oprócz kilka innych rzeczy ma dwie pętle - jedna kopiuje zawartość sekcji .data (czyli zmienne zainicjalizowane) z Flasha/ROM w odpowiednie miejsce RAM-u (określone adresami _data i _edata) a druga zeruje sekcję .bss (zmienne zainicjalizowane) czyli kawałek RAM pomiędzy adresami _bss i _end. To zerowanie w zasadzie nie jest potrzebne/wymagane, ale tak się przyjęło i wielu koderów tak robi - bo korzystają z przykładów dostarczonych z kompilatorem. ;-) Co do czasu wykonania i bajtów to nie widzę problemu - taka pętla zerująca to jest ze 20-30 bajtów kodu (dla adresów 32 bitowych) i jest wykonywana tylko raz podczas startu urządzenia/aplikacji. Chyba dla większości typowych sterowników nie będzie miało znaczenia czy aplikacja startuje 5 czy też 6ms. Jeśli koniecznie chcesz uniknąć zerowania .bss to po prostu zamiast kodu startowego z avr-libc wstaw swój własny.

Słówko kluczowe "static" w zasadzie ma niewiele wspólnego ze zmiennymi globalnymi.

Regards, /J.D.

Wed, 26 May 2004 18:02:57 +0200, na pl.misc.elektronika, Paweł Kurzawa napisał(a):

Dobrze mówisz - właśnie atrybut noinit to robi ( chociaż static nie ma tu nic do rzeczy ). Tylko w takim zastosowaniu to nie ma IMHO zupełnie znaczenia - strata czasu jest praktycznie przy starcie niezauważalna, a kod pętli i tak jest generowany. Sekcja noinit przydaje się natomiast radykalnie gdy chcesz zachować wartości zmiennych przy restarcie po zadziałaniu watchdoga.

z tym static sie zagalopowalem ...

chyba sobie odpuszcze na tych noinit sie juz przejechalem w bascomie ...

dzieki za podpowiedz ...

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required