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

Umieszczanie łańcuchów znakowych we FLASH - step by step

Jakub17 09 Mar 2018 16:36 345 2
  • #1 09 Mar 2018 16:36
    Jakub17
    Poziom 6  

    Witam

    Niby prosta rzecz a nie wychodzi mi... Chce umieścić łańcuchy znaków w pamięci FLASH przy użycium atrybutu __progmem oraz symboli __flash o __memx. W każdym z przypadków dane nie mogą znaleźć się w pamięci FLASH. Mało tego, podgląd pamięci w Atmel Studio podczas debugowania nie wskazuje nawet że dane te znajdują się w pamięci SRAM. Uzywam płytki Xplained Mini z procesorem ATmega328P na pokładzie i interfejsem do debugowania mEDBG. Czy należy jakoś skonfigurować dodatkowo środowisko oprócz użycia wyżej wymienionych słów kluczowych?

    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 2
  • SterControl
  • Pomocny post
    #2 09 Mar 2018 16:41
    grko
    Poziom 32  

    @Jakub17 Musisz użyć tych zmiennych w swoim programie bo inaczej kompilator (linker) uzna, że są niepotrzebne i usunie je z pliku wynikowego.

    0
  • SterControl
  • #3 10 Mar 2018 10:51
    Jakub17
    Poziom 6  

    Dzięki! Działa :)

    Dodano po 17 [godziny] 43 [minuty]:

    Mam jeszcze dodatkowe pytania odnośnie makra PSTR i pochodnych z użyciem __flash.
    Definicja PSTR to:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    1. Jak rozumiem makro to rzutuje adres danego literalu na adres, który powinien znaleźć się w pamięci FLASH, tak?
    2. Nie rozumiem dlaczego makro PSTR nie działa poza ciałem funkcji... Raczej spodziewałbym się odwrotnej sytuacji tzn. że nie działa w funkcji właśnie. W końcu
    W końcu literał musi mieć statyczny przydział, a jeżeli zostanie utworzony wewnątrz funkcji to ma przydział automatyczny co jest niezgodne z wykorzystaniem atrybutu __progmem__, dobrze rozumiem?
    3. Skorzystanie z makra
    Kod: c
    Zaloguj się, aby zobaczyć kod
    powoduje błąd: compound literal qualified by address-space qualifier pamiec_flash . Nie wiem o co chodzi kompilatorowi, przecież wyraźnie zaznaczyłem, że tablica ma się znaleźć we FLASH.
    4. Z kolei makro #define PGM_STR1(X) ( (const __flash char*){X} ) działa w main, ale nie chce działać w innej funkcji. Defacto zapis z tworzeniem tablicy i pojedynczego wskaźnika można uznać funkcjonalnie identyczny, a jednak kompilator robi problemy.

    0