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

[MEGA168][C] Bootloader zmiana fragmentu programu.

lucas_mcs 27 Lis 2009 10:15 1238 7
  • #1 7314398
    lucas_mcs
    Poziom 22  
    Nie mogę zlaneźć konkretnej informacji więc pytam o wasze doświadczenia w tym temacie:
    [Przedstawiam problem obrazowo]
    Mam w kodzie programu zapisany statyczny słownik(lub kilka), załóżmy:

    char slownik[20][2] = { { 'kot', 'cat'}, { 'pies', 'dog'}... itd
    char costam[30][3] = ....
    (nie jest istotne w tej chwli jak ten słownik wygląda i co zawiera)
    oraz znana mi jest wcześniej wielkość tego słownika.

    Chciałbym umieścić te zmienne (ten słownik) w danym obszarze pamięci (bynajmniej znać początkowy adres) oraz przez bootloader móc zastępować tylko ten słownik oraz jego wielkość, a pozostały program pozostawić bez zmian.

    Moje pytanie brzmi czy to jest możliwe w takim lub zbliżonym rozwiązaniu, czy koniecznie muszę wgrać cały program do flasha od nowa oraz jeśli da się czy ktoś jest wstanie mnie nakierować na info jak takie coś wykonać (jak ulokować dane w konkretnym obszarze pamięci i zmieniać ten obszar za pomocą bootloadera)

    Proszę nie proponować innych opcji rozwiązania typu "czemu nie zastosujesz zewnętrzny flash na słownik, czemu ten słownik ma taka forme" itp interesuje mnie ten konkretny przypadek.

    Pozdrawiam i dzięki za wypowiedzi wszystkich doświadczonych!
  • #2 7314546
    Konto nie istnieje
    Konto nie istnieje  
  • #4 7314646
    Konto nie istnieje
    Konto nie istnieje  
  • #5 7314747
    lucas_mcs
    Poziom 22  
    albertb napisał:
    Jest to możliwe.
    Przy takim deklarowaniu korzystasz i tak z pamięci RAM.
    Jest ona inicjowana przy starcie programu danymi z flasha startupem C.
    Ponieważ chcesz zmieniać także rozmiar danych, więc odpada wykorzystanie tego mechanizmu. Chyba, że napiszesz własny startup.
    Proponuję więc wgrywać bootloaderem w arbitralnie wybrany obszar flasha, upewniając się, że program go nie wykorzystuje.
    W programie natomiast dodać procedury kopiujące go w wolny obszar RAM przy starcie systemu.

    Albert


    Dzięki za wypowiedź, nie do końca rozumiem;)

    Chcę uzyskać cos takiego


    
    
    ====Pamięć FLASH Atmega168=====
    |-------------------
    |
    |    Bootloader 
    |
    |-------------------
    |
    |    Program stały
    |
    |-------------------
    |
    |  Ew free space
    |
    |-------------------
    ===== znany adres====
    |
    |   zmiennny słownik
    |
    |-------------------
    |
    |  free space
    |    lub dalsze
    |   części słownika
    |  aż do końca pamięci
    
    
    
    



    ten słownik to wystarczy mi wskaźnik do adresu i potem można sobie czytać aż do NULL
    i tak jak napisałem wcześniej: problem przedstawiłem obrazowo
    można np założyć, że program zajmie 8k, potem będzie 2k wolnego i ostatnie 6kb będzie taki słownik


    Interesuje mnie w zasadzie tylko jak na początku skompilować i wgrać program do flasha (programatorem) zeby ten słownik miał początek w konkretnym miejscu
    i potem ten fragment sobie edytować nie wpływając na resztę programu

    Bootloader mogę sobie napisać tylko nie wiem zbytnio jak ugryźć problem (brak doświadczenia wtej dziedzinie) umieszczania kodu w konkretnym rejonie pamięci[/quote]
  • Pomocny post
    #6 7314784
    tmf
    VIP Zasłużony dla elektroda
    Przeczytaj to:
    http://www.nongnu.org/avr-libc/user-manual/FAQ.html
    ze szczegolnym uwzglednieniem sekcji:
    'How do I put an array of strings completely in ROM?'
    i
    'How do I relocate code to a fixed address?'.
    Powinno byc wszystko jasne.
  • #7 7314873
    kamyczek
    Poziom 38  
    Nie potrafisz napisać "org XXXX" przed słownikiem ? kompilator umieści slownik poczynając od tego adresu ;)
  • #8 7315001
    lucas_mcs
    Poziom 22  
    tmf napisał:
    Przeczytaj to:
    http://www.nongnu.org/avr-libc/user-manual/FAQ.html
    ze szczegolnym uwzglednieniem sekcji:
    'How do I put an array of strings completely in ROM?'
    i
    'How do I relocate code to a fixed address?'.
    Powinno byc wszystko jasne.


    Jak najbardziej dziękuje za to ;)
REKLAMA