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

[avr] Czy plik hex z avr-gcc może mieć nieciągłe adresy bez sekcji boot?

superduo 25 Kwi 2013 11:56 2361 6
  • #1 12237583
    superduo
    Poziom 13  
    Zastanawiam się czy w wygenerowanym pliku hex (kompilator avr-gcc) w programie bez sekcji boot ciągłość adresów jest zachowana?

    Przykładowy hex wygląda tak:

    :100000000C9493040C94B4040C94B4040C94B404B1
    :100010000C94B4040C94B4040C94B4040C94B40480
    :100020000C94B4040C94B4040C94B4040C94B40470
    :100030000C94B4040C94B4040C94B4040C94B40460

    Gdzie adresy pamięci zaznaczyłem pogrubieniem.

    W hex'ie występują czasem "dziwne" wcięcia:

    :1031F000C9F7620F731F841F951FA01D0895AA1B96
    :10320000BB1B51E107C0AA1FBB1FA617B70710F0D1
    :10321000A61BB70B881F991F5A95A9F78095909503
    :0A322000BC01CD010895F894FFCF22
    :10322A00756E6C6F636B006C6F636B004154480082
    :10323A0041542B5153434C4B3D31004154204530AE

    Najczęściej pod koniec pliku (i jest tylko jedno, ale np w STMach jest ich więcej).

    Mimo tego wcięcia ciągłość adresów jest zachowana.

    Pytanie czy możliwa jest sytuacja w której adres zmieni się nagle np z pozycji 1000 na 2000, tworząc dziurę w pamięci.

    Przykładowy hex który generowałem powstał z programu który posiada przerwania, zmienne, stałe i odwołania do pamięci flash (stałe tekstowe). EEpromu nie używam.

    Piszę właśnie bootloader i muszę wiedzieć czy moge sobie z takiego hexa wyciąć tylko pola zawierające dane (czyli odrzucić kontrolę adresu).
  • #2 12237643
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie możesz. Musisz poprawnie interpretować pola adresów i długości rekordów w pliku HEX. Nie ma nawet obowiązku, by adresy były ułożone kolejno, chocciaż zdrowy rozsądek i praktyka wsazuje na to, że są. W obrazie HEX mogą występować "dziury" i loader musi sobie z nimi radzić.
  • #3 12240631
    superduo
    Poziom 13  
    Napisałem program ucinający niepotrzebne dane i generujący nowy plik hex bez adresów. Program sprawdza również czy nie ma przeskoku adresu. Testowałem go na wielu kodach i nie stwierdzam skoków: w mniej czy bardziej rozbudowanych programach.

    Pozatym pamięć flash mikrokontrolera (atmega2561) zapisywana jest po 256 bajtów. Co należało by zrobić gdyby "dziura" pokazała się wewnątrz takiego bloku?
  • #4 12240776
    BlueDraco
    Specjalista - Mikrokontrolery
    Jest to o tyle ciekawe, że powyżej pokazałeś fragment .hex z 6-bajtową dziurą.

    Dziury należy wypełniać wartością taką, jaką ma flash po skasowaniu - zwykle 0xFF.
  • #5 12240783
    tmf
    VIP Zasłużony dla elektroda
    Jeśli ucinasz adresy, to nie jest to już plik hex.
    Przeskoki pojawiają się jeśli używasz nowych sekcji programu, lub przesuwasz istniejące. Jak pisał kolega BlueDraco, absolutnie nie wolno pomijać tego elementu pliku hex.
    Co do stron pamięci - jeśłi masz dziurę wewnątrz strony, to najpierw musisz przeparsować cały hex, aby sprawdzić czy cos w tej dziurze nie siedzi, po czym zaprogramować. Jeśli parser jest na PC to sprawa jest prosta - wystarczy sobie zrobić blok pamięci o wielkości pamięci FLASH i do niego wpisać dane z hex, a potem dopiero programować mikrokontroler. Jeśli parsujesz na mikrokontrolerze to to rozwiązanie odpada. Trzeba wtedy przy każdej dziurze parsować całego hexa w poszukiwaniu czy coś się do tej dziury nie odwołuje.
  • #6 12241163
    Konto nie istnieje
    Konto nie istnieje  
  • #7 12241575
    superduo
    Poziom 13  
    Właśnie miałem to napisać (Brak tam dziury) ale albertb mnie uprzedził :)

    Ja pytam o skok w adresie a nie o "wcięcie" w pliku.
REKLAMA