Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][AVR] - W jakiej pamięci zapisana jest zmienna.

lucas234 06 Maj 2015 16:42 1068 19
  • #1 06 Maj 2015 16:42
    lucas234
    Poziom 15  

    Chciałbym się dowiedzieć czy w języku C na AVR istnieje jakiś sposób w jakiej pamięci została zapisana zmienna. Dokładniej chodzi mi o to czy znajduje się w: RAM, FLASH czy EEPROM.

    0 19
  • #3 06 Maj 2015 16:46
    lucas234
    Poziom 15  

    To wiem. Chodzi mi np. o to czy istnieje jakiś specyfikator który by mi powiedział że zmienna nie została jednak zapisana w pamięci RAM a np. w FLASH.

    0
  • #4 06 Maj 2015 16:51
    dondu
    Moderator Mikrokontrolery Projektowanie

    Powtórzę jeszcze raz:

    dondu napisał:
    Standardowa zmienna znajduje się w pamięci SRAM.


    lucas234 napisał:
    ...że zmienna nie została jednak zapisana w pamięci RAM a np. w FLASH.

    Co znaczy że jednak została zapisana gdzie indziej?
    To Ty decydujesz, gdzie ma być zapisana. Nie może być tak, że Ty decydujesz o zapisaniu w SRAM, a mikrokontroler zapisuje w EEPROM.

    0
  • #5 06 Maj 2015 16:51
    Samuraj
    Poziom 35  

    Jeśli to zmienna i była by zapisana w pamięci FLASH to jak byś zmieniał jej wartość :?:

    0
  • #6 06 Maj 2015 21:22
    lucas234
    Poziom 15  

    No dobrze to ja powiem inaczej. Jeżeli zmienna w RAM to jedna procedura natomiast jeżeli we FLASH to druga procedura. Ja potrzebuje "coś" co rozróżnia gdzie zapisana jest "zmienna".

    0
  • #7 06 Maj 2015 22:18
    mi14chal
    Poziom 28  

    Napisz lepiej co chcesz osiągnąć bo co ci da wiedza gdzie zmienna jest zapisana?

    0
  • #8 07 Maj 2015 00:04
    trol.six
    Poziom 30  

    lucas234 napisał:
    Dokładniej chodzi mi o to czy znajduje się w: RAM, FLASH czy EEPROM.

    Zdarzyło mi się testować kod generowany przez różne kompilatory z różnymi opcjami optymalizacyjnymi. I w sumie może się okazać że tej zmiennej w ogóle nie będzie, bo zostanie optymalizacyjnie wchłonięŧa.

    Modyfikacja programu spowoduje wygenerowanie innego kodu.

    Po czym to poznaje? Przeglądam plik *.lst

    0
  • #9 07 Maj 2015 02:17
    Intre
    Poziom 10  

    lucas234 to Ty jesteś programistą i Ty decydujesz jakiego typu jest zmienna i gdzie ona ma być zapisana, w której pamięci w zależności od założeń urządzenia które programujesz i tego co chcesz osiągnąć, tak dla przykładu:

    deklaracje zmiennych w których pamięciach maja się znaleźć:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    przykład zapisu lub odczytu zmiennej z pamięci EEPROM:
    Kod: c
    Zaloguj się, aby zobaczyć kod



    Tu Ci mogę też polecić dobre filmy na kanale youtube Atnel - mirekk36 Link tłumaczące zapisywanie i odczytywanie do poszczególnych pamięci, a przy okazji się dowiesz o strukturach i wskaźnikach:

    Myślę że po obejrzeniu tych filmów będziesz wiedział więcej i rozumiał o co chodzi z tymi poszczególnymi pamięciami w procesorach AVR (daje przykładowe linki, reszta do wyklinania na kanale):

    Link


    Link


    I masz to też ładnie opisane w książce Tomasza Francuza "Jezyk C dla mikrokontrolerów AVR od podstaw do zaawansowanych aplikacji" p. w rozdziale 7 str 177 o EEPROM i 8 rozdział str 189 o FLASH. Ale polecałbym Ci najpierw obejrzenia w/w filmów a potem uzupełnienie wiedzy literaturą gdyż jest to w zrozumieniu zdecydowanie wtedy prostsze.

    1
  • #10 07 Maj 2015 07:36
    Pituś Bajtuś
    Poziom 28  

    lucas234 napisał:
    No dobrze to ja powiem inaczej. Jeżeli zmienna w RAM to jedna procedura natomiast jeżeli we FLASH to druga procedura. Ja potrzebuje "coś" co rozróżnia gdzie zapisana jest "zmienna".

    Może prościej będzie jak porzucisz kaleką architekturę AVR i zastosujesz taką w której będzie jedna procedura niezależnie od tego w jakim typie pamięci dana "zmienna" się znajduje.

    0
  • #11 07 Maj 2015 08:52
    dondu
    Moderator Mikrokontrolery Projektowanie

    lucas234 napisał:
    No dobrze to ja powiem inaczej. Jeżeli zmienna w RAM to jedna procedura natomiast jeżeli we FLASH to druga procedura.
    Ja potrzebuje "coś" co rozróżnia gdzie zapisana jest "zmienna".

    Jeśli jedną książkę kładziesz na półce ściennej, a drugą w szafie, to Tylko Ty wiesz gdzie je położyłeś. Powtórzę wiec:

    dondu napisał:
    To Ty decydujesz, gdzie ma być zapisana. Nie może być tak, że Ty decydujesz o zapisaniu w SRAM, a mikrokontroler zapisuje w EEPROM.


    W zawiązku z tym, opisz (podaj przykład) w jakim przypadku nie wiesz, gdzie jest zapisana zmienna (SRAM, FLASH, EEPROM) i potrzebujesz określić:

    lucas234 napisał:
    Dokładniej chodzi mi o to czy znajduje się w: RAM, FLASH czy EEPROM.
    ...
    Chodzi mi np. o to czy istnieje jakiś specyfikator który by mi powiedział że zmienna nie została jednak zapisana w pamięci RAM a np. w FLASH.

    0
  • #12 07 Maj 2015 11:01
    lucas234
    Poziom 15  

    Ja doskonale wiem że to ja decyduje gdzie ma trafić zmienna lub stała. Problem polega na tym że do odczytu danych z pamięci FLASH w AVR stosuje się te głupie specyfikatory np.

    Kod: c
    Zaloguj się, aby zobaczyć kod

    i tu leży mój problem bo chciałbym napisać uniwersalną procedure obsługi wyświetlacza LCD na HD44780 która bez względu na to czy napis jest zapisany w RAM, EEPROM czy FLASH wykonywała odpowiedni program.

    Szkoda że nie ma np. rozróżnienia w adresie pamięci gdzie znajduje się zmienna. Fajne byłoby np. takie coś:
    00x0000 - pamięć RAM
    01x0000 - pamięć FLASH
    02x0000 - pamięć EEPROM
    Widzę niestety że architektura AVR jest pod tym względem ułomna i niestety nie da się tego rozróżnić. Niestety trzeba klepać "miliony" różnych podprogramów żeby zrobić wyświetlanie na LCD napisu. Zamiast zawrzeć to w jednej troszke bardziej rozbudowanej procedurze.[/syntax]

    0
  • #13 07 Maj 2015 11:18
    Intre
    Poziom 10  

    No ale co za problem stworzyś sobie funkcje w bibliotece do wyświetlacza LCD która by Ci wyświetlała napis z odpowiedniej pamięci. Ba nawet by mogła definiować w jakiej pamięci dana zmienna ma się znaleść

    Przykłady deklaracji:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    1
  • #14 07 Maj 2015 11:21
    lucas234
    Poziom 15  

    Tak, tylko ja chcę mieć jedną funkcję do wyświetlania o nazwie LCD, która bez względu na to, gdzie jest zapisany napis ma go wyświetlacz. Nie chcę mieć kilku funkcji.

    0
  • #15 07 Maj 2015 11:31
    dondu
    Moderator Mikrokontrolery Projektowanie

    lucas234 napisał:
    Ja doskonale wiem że to ja decyduje gdzie ma trafić zmienna lub stała.

    To następnym razem zadawaj konkretne pytania od początku pokazując dokładnie o co Ci chodzi.


    lucas234 napisał:
    Tak tylko ja chce mieć jedną funkcje do wyświetlania o nazwie lcd która bez względu na to gdzie jest zapisany napis ma go wyświetlacz. Nie chce mieć kilku funkcji.

    Nie ma innej możliwości, a nawet jeżeli jest, to nadal twierdzić będziemy, że to Ty decydujesz, która zmienna gdzie jest umieszczana, więc skoro chcesz ją wyświetlić, to dokładnie wiesz jak należy ją pobrać i którą wersję funkcji należy wywołać (jak radzi kol. Intre), by daną zmienną wyświetlić.

    Innymi słowy dążysz do stworzenia potworka programowego, który pod pozorem uniwersalności niepotrzebnie komplikuje Twoje oprogramowanie.

    Edit:
    lucas234 napisał:
    ... stosuje się te głupie specyfikatory

    Oj, z takim podejściem do tematu daleko nie zajdziesz :)

    1
  • #16 07 Maj 2015 11:48
    lucas234
    Poziom 15  

    Dobra to zadam jeszcze jedno pytanie. Do pliku nagłówkowego <avr/pgmspace.h> i <avr/eeprom.h>. Powinny być chyba pliki z rozszerzeniem .c z programami. Dlatego mam pytanie gdzie je znaleźć?

    0
  • #17 07 Maj 2015 12:08
    dondu
    Moderator Mikrokontrolery Projektowanie

    lucas234 napisał:
    Powinny być chyba pliki z rozszerzeniem .c z programami. Dlatego mam pytanie gdzie je znaleźć?

    Nie muszą - przyglądnij się zawartości .h
    Poza tym skoro są to biblioteki zintegrowane z toolchain, to po co chcesz w nich grzebać.

    0
  • #18 07 Maj 2015 12:10
    szelus
    Specjalista - Mikrokontrolery

    W pgmspace są zawarte definicje chyba wszystkich funkcji (jako inline) więc raczej nie ma nic więcej.
    W eeprom funkcje są zadeklarowane jako extern, więc źródła funkcji będą w źródłach biblioteki (avr-libc), do pobrania z internetu.
    Nie ma ani wymagania, ani praktyki, aby jednemu plikowi .h odpowiadał jeden plik .c.

    0
  • #19 07 Maj 2015 12:14
    michalko12
    Specjalista - Mikrokontrolery

    http://download.savannah.gnu.org/releases/avr-libc/
    Część kodu jest w plikach nagłówkowych .h w postaci makr i funkcji inline.


    Jak chcesz mieć jedną funkcję korzystającą z różnych pamięci (SRAM, FLASH) bez zbędnych zabiegów to zmień uC na takie z inną architektur. AVR się do tego nie nadaje.

    0
  • #20 08 Maj 2015 11:42
    trol.six
    Poziom 30  

    dondu napisał:
    Innymi słowy dążysz do stworzenia potworka programowego, który pod pozorem uniwersalności niepotrzebnie komplikuje Twoje oprogramowanie.

    4kB program bez "nadmuchaczy kodu" typu float itp. to już mały potworek ;)
    Wraz z ilością kodu potworek rośnie.

    Śmigły rycerz czy się boi czy nie potworków,może chcieć zmierzyć się z potworkiem i śmigle lub nie, śmignąć kod.
    Szczególnie jak potworek zionie różnorodnymi danymi, do różnych interfejsów.

    Wiadomo, nie ma głupich rzeczy, tylko są "plusy dodatnie i plusy ujemne".
    Jedna funkcja odczytu ma swoje plusy dodatnie, bo ułatwia ogarnięcie programu.
    I sprawniejsze radzenie sobie z potworkami. Szczególnie jak się ma wiele zmiennych,

    taki kod jest czytelniejszy:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    niż rzutowania i różnorodne funkcje.

    Plusy ujemne to jakaś tam gimnastyka, i ewentualnie dodatkowy narzut czasowy.

    Ale po to są funkcje by je tworzyć, a procesor po to by dane przetwarzał.

    Początkowo rozważałem struktury. Ale to troche rozdmuchane dla wielu zmiennych.
    Dawno w C pod w avr-e nie pisałem, i nigdy jakoś nie wnikałem jakoś bardziej szczególniej w niuanse.

    Może modyfikacja wskaźników?
    Wczoraj cosik napisałem, ale kompilator mi oznajmił, że pewnych danych na tym etapie nie da sie wyliczyć. :)
    Chociaż jakoś potrafi policzyć wskaźnik do FLASH i go tam umieścić. :)
    Widocznie resztę roboty odwala linker.

    Troszkę obszedłem problem, i myśle że adresy może generować mały programik przed kompilacją.
    A plik z danymi będzie w pliku "h"

    Inne plusy ujemne, na takich wskaźnikach nie działają typowe funkcje.

    Ma też inne ograniczenia, stąd na razie czytam jak zamieścić blok danych do określonego miejsca. Nie wiem na ile ten potworek będzie sensowny :)

    0