logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ATmega2560][C] Wskaźniki w funkcji do pamięci programu

Slawek_K 17 Kwi 2012 20:05 1395 10
  • #1 10805337
    Slawek_K
    Poziom 12  
    Witam,

    Przedstawiam poniżej program (kompilator AVRGCC+AVRStudio5), który przygotowałem jako testowy, jest to fragment większego projektu. Jego zadanie polega na odczycie kilku parametrów z pamięci EEPROM, sprawdzenie czy jest w określonym zakresie, jeśli nie jest to wprowadza wartość domyślną i zapisuje z powrotem do pamięci EEPROM. Program działa prawidłowo jeśli zmienne znajdują się w pamięci RAM.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Problem w poprawności działania pojawia się wówczas gdy będę chciał umieścić "zmienne" Param_def, Param_min oraz Param_max w pamięci Flash. Poniżej kod programu. Różnica pomiędzy tymi programami polega na dodaniu słowa PROGMEM przy deklaracji "zmiennych" Param_def, Param_min i Param_max. W jaki sposób należy użyć parametrów przy wywołaniu funkcji Spr_param aby wskaźniki były ustawione na pamięć Flash, a nie na pamięć RAM. Próbowałem różnych konstrukcji i nie osiągnąłem właściwego rezultatu. Funkcja zawsze odwoływała się do pamięci RAM.

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    pozdrawiam
    Sławek
  • #2 10805476
    mirekk36
    Poziom 42  
    Z pamięci Flash to najpierw musisz odczytać z kolei za pomocą funkcji typu:

    pgm_read_byte()
    pgm_read_word()

    itp .... a dopiero potem przekazać do EEPROM

    dużo łatwiej by ci było to robić gdybyś zamiast stosować takie luzem zmienne wrzucone do EEPROM jak ziemiaki do piwnicy bez worków, to poukładałbyś je ładnie na półkach i w workach - czyli ubrał w strukturę ;)

    Wtedy kopiowanie i przerzucanie byłoby dużo wygodniejsze ;)
  • #3 10806068
    Slawek_K
    Poziom 12  
    Witam,

    Zapis do EEPROM jest przykładowy i nie ma tutaj większego znaczenia. W moim docelowym programie używam struktur danych. Dla uproszczenia użyłem zmiennych typu int16_t. Chodzi raczej o przekazanie parametrów (wskaźników do pamięci Flash) w funkcji. W jaki sposób należy prawidłowo to wykonać? Czy należy ustawić wskaźniki poza funkcją?

    pozdrawiam
    Sławek
  • #4 10806085
    mirekk36
    Poziom 42  
    ale chcesz ustawić do czego te wskaźniki - no toż ci piszę, że jeśli chcesz sobie np z Flasha odczytać zmienną np uint16_t to piszesz:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    teraz jaśniej ?
  • #5 10806141
    Slawek_K
    Poziom 12  
    Witam,

    W tym miejscu pobierasz wartość tej zmiennej. To wiem i tego używam w innej części programu. Problem dotyczy czegoś innego. Ja chce przekazać adres tej zmiennej w pamięci programu do funkcji. Dopiero w funkcji jest pobierana jej wartość i porównywana. Moja funkcja docelowa jest bardziej rozbudowana, dla zrozumienia uprościłem ją.

    pozdrawiam
  • #6 10806208
    mirekk36
    Poziom 42  
    Ok teraz chyba rozumiem, czyli np:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    tak by wyglądała deklaracja funkcji w której argumentem jest wskaźnik a niżej jej wywołanie w programie. Gdyby chodziło o tablicę w pamięci flash to np:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a potem w kodzie:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #7 10806846
    Slawek_K
    Poziom 12  
    Witam,

    Dokładnie o to mi chodzi. Nie wiem w jakiej formie w miejscu wywołania funkcji wstawić argumenty w postaci wskaźnika do danych w pamięci Flash.
    Jakieś konkretne propozycje?

    pozdrawiam
  • #8 10806974
    michalko12
    Specjalista - Mikrokontrolery
    Konkretne propozycje tzn gotowiec?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 10807005
    gaskoin
    Poziom 38  
    Można sobie jeszcze zrzutować to, co zwróci pgm_read na wskaźnik żeby kompilator nie marudził :)
  • #10 10807503
    Slawek_K
    Poziom 12  
    Witam,

    Sprawdziłem to co zaproponował michalko12 i w symulatorze działa poprawnie. Po południu sprawdzę jak działa w rzeczywistym układzie. Dzięki za pomoc.

    pozdrawiam
  • #11 10808679
    michalko12
    Specjalista - Mikrokontrolery
    gaskoin napisał:
    Można sobie jeszcze zrzutować to, co zwróci pgm_read na wskaźnik żeby kompilator nie marudził :)


    A w którym miejscu ma marudzić? Przecież porównanie następuje już z wyłuskaną wartością, a nie z wartością samego wskaźnika.
REKLAMA