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

[AVR-GCC][@M328] - Sposób kompilacji zmiennych z predefiniowaną wartością do pam

kbw24 01 Lut 2016 16:10 837 3
  • #1 15392814
    kbw24
    Poziom 14  
    Witam,

    Mam proste pytanie. Zastanawia mnie, w jaki sposób obsługiwane są przez kompilator i następnie w procesorze, zmienne, którym podczas pisania programu przypisuje się konkretną wartość. Istnieje spory zasób informacji o procedurach czytania wartości z obszaru pamięci programu, jednakże przecież przy zwykłym

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


    program również działa tak, jak trzeba.

    Pytam, ponieważ mam sytuację taką, że w
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    mam zapisane dane przedstawiające znaki ASCII. Początkowo zmienna ta miała być ładowana wartościami zapisanymi w pamięci EEPROM, jednakże bez wątpienia powoduje to pochłonięcie sporej części pamięci SRAM. Czytanie jej z kolei na bieżąco z pamięci FLASH stałoby się słabym punktem programu, powodując spowolnienie procesu poszukiwania, dekodowania i wysyłania znaku. Wnioskując z powyższego faktu - zmienna z predefiniowanymi wartościami spełnia swoją rolę bez wymuszania użycia pamięci FLASH/EEPROM - wartości te muszą być jakoś przekazywane, czyli kompilator przetwarza je na rzeczywistą część umieszczoną w programie. I właśnie - w jaki sposób jest to potem odtwarzane? Również mamy do czynienia z "pochłonięciem" pamięci SRAM? Czy może wszystko jest na sztywno zapisane w kodzie maszynowym?

    Z góry dziękuję za odpowiedź.
    Pozdrawiam. :)
  • #2 15392998
    szczywronek
    Poziom 28  
    Nie jestem pewny czy dobrze rozumiem istotę Twojego pytania ;) Wartości inicjalizowanych zmiennych globalnych (i lokalnych statycznych) są zapisywane w pamięci Flash mikrokontrolera. Przed skokiem do funkcji main, procedura "rozruchowa" (dodawana przez kompilator) kopiuje te wartości z pamięci flash do pamięci sram.
  • #3 15393172
    Konto nie istnieje
    Konto nie istnieje  
  • #4 15407956
    krru
    Poziom 33  
    Tak w uproszczeniu kompilator generuje 3 sekcje - text, data i bss. Pierwsza zawiera kod, druga zainicjowane zmienne, trzecia jest pusta i zawiera tylko deklaracje rozmiaru i jest przeznaczona na zmienne niezainicjowane (obie sekcje są na zmienne statyczne/globalne). Jak działa uruchomienie to zależy od architektury. W normalnych komputerach, gdzie program do uruchomienia jest w pliku, system allokuje pamięć na sekcje, wczytuje z pliku zawartości sekcji text i data, a obszar na sekcje bss allokuje i zeruje. W systemach wbudowanych, w których można wykonywać kod z pamięci stałej (jak ATMega) kod binarny zawiera sklejone sekcje text i data, zawartosci sekcji data jest kopiowana do ramu, potem kolejny obszar wielkości bss jest zerowany i dopiero rusza funkcja main. Adresy i rozmiary sekcji generuje linker i umieszcza w odpowiednich symbolach, które zostają użyte w kodzie startowym.
REKLAMA