eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronika › CVAVR - jak nie inicjalizować wartości zmiennej
Ilość wypowiedzi w tym wątku: 20

  • 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.

strony : 1 . [ 2 ]


Szukaj w grupach

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: