Goto page Previous 1, 2
Adam Dybkowski
Guest
Wed Jan 28, 2009 8:00 pm
T.M.F. pisze:
Quote:
Jeżeli zmienna wpadnie do sekcji .bss - to zostanie automatycznie
wyzerowana. Jeżeli potrzeba zmiennej, która nie będzie inicjowana,
trzeba skorzystać z dobrodziejstwa sekcji ".noinit".
W takim przykladzie:
void main()
{
int a;
if(a==costam) DoSomething();
}
Zmienna a nie bedzie inicjalizowana. Poniewaz za kazdym razem trafia w
to samo miejsce programu jej wartosc bedzie zachowana pomiedzy
uruchomieniami. Oczywiscie kompilator wyrzuci ostrzezenie, ze uzywamy
niezainicjalizowanej zmiennej, ale w koncu o to nam chodzi.
Zmienna "a" jest w powyższym przykładzie lokalna i oczywiście trafi na
stos lub zostanie upchnięta w rejestrze. W twoim przykładzie tak się
składa, że zawsze trafi w to samo miejsce (bo jest w funkcji main -
wywoływanej zawsze tak samo i z tego samego miejsca) ale gdyby była w
innej funkcji to już nie będzie tak różowo.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
EM
Guest
Thu Jan 29, 2009 12:12 pm
Witam
Zgodnie z sugestiami zastosowałem coś takiego:
void main(void)
{
unsigned char short_off_indicator[2];
....
if (short_off_indicator[0] == ~ short_off_indicator[1]) {short_off())
else long_off()
....
short_off_indicator[0] = next_mode;
short_off_indicator[1] = ~ next_mode;
....
}
Ogólnie działa dobrze :)
Dziękuję za szybką i konkretną pomoc
--
Pozdrawiam
EM
jacek
Guest
Fri Jan 30, 2009 8:50 am
EM pisze:
Quote:
Witam
Nie jestem biegły w programowaniu i mam taki problem odnośnie AVRka
programowanego za pomocą CodeVision AVR.
Otóż potrzebuję na początku programu sprawdzić wartość 2 komórek pamięci
RAM. Zakładam, że komórki te mają wartość taka jak poprzednio, jeśli
napięcie zasilania nie spadło poniżej pewnego poziomu. Podobnie robię w
PICach i to się dobrze sprawdza.
Umiem zmusić program do umieszczenia danych w konkretnym obszarze, robi
się dodając adres po nazwie zmiennej, np.
char data @0x60;
jednak z tego co widzę, to nawet pomimo wyłączonej opcji: clear global
variables at program startup w konfiguracji projektu - wygląda na to, że
te zmienne są zerowane.
To co mi przychodzi na myśl, to użyć jakiejś wstawki assemblerowej,
gdzie będę kopiował wartość z komórki RAM o konkretnym adresie do
jakiejś zmiennej w C.
Potrzebuję tak przekopiować dwie komórki, które mają nie być zerowane
przy inicjalizacji.
Proszę o pomoc
--
Pozdrawiam
EM
W przypadku PICa i kompilatora hitech słuzy do tego modyfikator
persistent umieszczony w deklaracji zmiennej; może u Ciebie podobnie będzie
Pozdr
jp
--
www.flowservice.pl
Adam Dybkowski
Guest
Sat Jan 31, 2009 12:36 am
EM pisze:
Quote:
Zgodnie z sugestiami zastosowałem coś takiego:
void main(void)
{
unsigned char short_off_indicator[2];
[...]
Ogólnie działa dobrze
Obyś się nie zdziwił, gdy po zmianie opcji optymalizatora wyjdzie co
innego, niż obecnie. Zdecydowanie polecam jeszcze doczytanie o sekcji
".noinit", chociażby w dokumentacji avr-libc.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
T.M.F.
Guest
Sat Jan 31, 2009 10:35 am
Adam Dybkowski pisze:
Quote:
EM pisze:
Zgodnie z sugestiami zastosowałem coś takiego:
void main(void)
{
unsigned char short_off_indicator[2];
[...]
Ogólnie działa dobrze :)
Obyś się nie zdziwił, gdy po zmianie opcji optymalizatora wyjdzie co
innego, niż obecnie. Zdecydowanie polecam jeszcze doczytanie o sekcji
".noinit", chociażby w dokumentacji avr-libc.
Coz moze wyjsc. Zeby to sie nie zoptymalizowalo w jakis dziwny sposob
wystarczy dodac volatile.
Goto page Previous 1, 2