-
11. Data: 2009-01-27 22:19:16
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: Adam Dybkowski <a...@4...pl>
T.M.F. pisze:
> W AVR-gcc wystarczy stworzyc globalna zmienna niestatyczna, kompilator
> nie inicjalizuje takich zmiennych.
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".
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-
12. Data: 2009-01-27 23:26:03
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: "T.M.F." <t...@n...mp.pl>
Adam Dybkowski pisze:
> T.M.F. pisze:
>
>> W AVR-gcc wystarczy stworzyc globalna zmienna niestatyczna, kompilator
>> nie inicjalizuje takich zmiennych.
>
> 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.
-
13. Data: 2009-01-28 09:45:48
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: EM <e...@p...onet.pl>
T.M.F. pisze:
>>> To co mi przychodzi na myśl, to użyć jakiejś wstawki assemblerowej,
>>
>> A takie coś:
>>
>> char data;
>> data = *(char*)0x60;
>>
>> nie działa?
>
> ALe to tylko odczyta komorke o adresie 0x60, ale nie spowoduje, ze
> zostanie ona zarezerwowana. W efekcie kompilator umiesci tam pierwsza
> lepsza zmienna i nic z tego nie wyniknie.
> W AVR-gcc wystarczy stworzyc globalna zmienna niestatyczna, kompilator
> nie inicjalizuje takich zmiennych.
Ale to mi powinno wystarczyć, sprawdzę w listingu, czy nie nastąpi jakiś
konflikt z wykorzystywaną komórką. Program jest prosty i akurat zasobów
RAM prawie nie wykorzystuje.
--
Pozdr
EM
-
14. Data: 2009-01-28 09:52:53
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: EM <e...@p...onet.pl>
T.M.F. pisze:
> Adam Dybkowski pisze:
>> T.M.F. pisze:
>>
>>> W AVR-gcc wystarczy stworzyc globalna zmienna niestatyczna,
>>> kompilator nie inicjalizuje takich zmiennych.
>>
>> 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.
Bardzo ciekawa propozycja jak dla mnie.
Rozumiem, że program przy każdym uruchomieniu natrafi na ten sam obszar
w RAM, a nie powinien on być inicjowany - zerowany.
Nie stanowi natomiast problemu, że tak na prawdę nie wiem jaki to będzie
adres.
Wcześniej próbowałem
void main()
{
char data @0x60;;
....
}
ale taki podanie adresu działa tylko dla zmiennych globalnych.
Sprawdzam...
--
Pozdrawiam
EM
-
15. Data: 2009-01-28 16:09:32
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: Konop <k...@g...pl>
> ale taki podanie adresu działa tylko dla zmiennych globalnych.
Dla lokalnych statycznych też chyba powinno ;).... ale nie o to chodzi :D
-
16. Data: 2009-01-28 19:00:25
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: Adam Dybkowski <a...@4...pl>
T.M.F. pisze:
>> 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.
-
17. Data: 2009-01-29 11:12:19
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: EM <e...@p...onet.pl>
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
-
18. Data: 2009-01-30 07:50:22
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: jacek <j...@w...pl>
EM pisze:
> 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
-
19. Data: 2009-01-30 23:36:36
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: Adam Dybkowski <a...@4...pl>
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.
--
Adam Dybkowski
http://dybkowski.net/
Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.
-
20. Data: 2009-01-31 09:35:32
Temat: Re: CVAVR - jak nie inicjalizować wartości zmiennej
Od: "T.M.F." <t...@n...mp.pl>
Adam Dybkowski pisze:
> 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.