Wpis z mikrobloga

Może któryś Mireczek albo Węgierka znająca się na #programowanie #mikrokontrolery #avr albo inne takie pomoże mi z jednym problemem.

Dostaje plik .hex i muszę go przesłać do urządzenia i tu pojawia się problem bo plik nie jest jednolity i ma wcięcia, ogarnąłem już standard w jakim to jest generowane ( Intel Hex - wikipedia ) ale jedna rzecz nie daje mi spokoju, dlaczego są zastosowane takie wcięcia skoro można było by dane dopełnić do poprzednich wierszy. Ktoś potrafi mi powiedzieć dlaczego tak to jest zapisane? takich wcięć jest kilka w całym kodzie hex

Ps. To jest fragment firmware urządzenia.

#arduino #elektronika #majsterkowanie #embedded
Pobierz bi-tek - Może któryś Mireczek albo Węgierka znająca się na #programowanie #mikrokontr...
źródło: comment_Sqm6JibTNMLA7OehN26ASVSuHgtNELEz.jpg
  • 13
@bi-tek: hexów nikt nie generuje na kolanie, tylko są generowane podczas generowania kodu wynikowego, jako efekt zlinkowania iluś modułów oprogramowania. Przykładowo do AVRa możesz mięc kilka wcięć bo soft zawiera kilka bloków - bootloader ładowany od jednego adresu, a potem kod właściwy ładowany ładowany od innego adresu... i jeszcze mogą być np zalinkowane dane statyczne (tablice/ciągi) które też zajmują osobną pamięć, rozsądnie by było by zaczynały się od nowego bloku pamięci
@hrumque: To akruat wiem, Tutaj dostałem akurat jakiś prosty kod byle bym się w tym odnalazł, domyślałem się że to działa tak jak w programowaniu n pc itp że kod wynikowy jest scalany.

@pietryna123: Też to zaobserwowałem po wczytaniu do programu do wgrywania kodu na STM że jest to ciągłe i stąd to pytanie dlaczego tak to jest zapisane.

@a231: no właśnie nie, tam nie ma żadnych dopełnień zerami
no właśnie nie, tam nie ma żadnych dopełnień zerami i sam tak na początku myślałem że jak jest niepełna linia to trzeba zera dopisać.


@bi-tek: Odwrotnie, jak po danych są zera to ich nie zapisujemy w hexie - bo po co je pisać skoro by default powinno być zero.
@bi-tek: To może być efekt linkowania. HEX to plik wynikowy całości. Jeśli masz wiele plikow źródłowych to one są kompilowane jako osobne bloki kodu, nie musi wyjść tego ostatecznie liczba bajtów podzielna przez 16. Potem linker to poskleja, pozamienia symbole na skoki do innych źródeł i odwołania do adresów z nagłówków i w dalszym kroku zrobi sobie optymalizację pod kątem zajętości pamięci, ale takie kawałki już zostają. Albo odwrotnie (najpierw optymalizacja,
Owszem ale dalej nie wiem czemu nie zapisał kompilator w grupach po 16

@bi-tek: sprawdź po adresach - czy jest ciągłe, tzn czy początkowy adres danej linii + liczba bajtów do zapisania daje ciągłość z początkowym adresem następnej linii. Może nie być, a nawet jak będzie - to każdy fragment to np jakaś skompilowana procedura/funkcja skompilowana z jakieś bibloteki osobno, i zlinkowane po prostu, a optymalizator tak powrzucał - gdy chcesz
@bi-tek: Tak zapisane, bo nic tam więcej nie ma, albo to jest sekcja z alignment(nie wiem jak to napisać po polsku) równym 8 bajtów.
https://gcc.gnu.org/onlinedocs/gcc-3.3/gcc/Type-Attributes.html

W tych wierszach masz po prostu mniej danych niż typowo po 16 bajtów. Jest to zgodne ze standardem zapisu.
Ponadto tak jak piszą wyżej - to układa w pamięci linker i można na przykład w AVRach dokleić bootloader na końcu, albo zdefiniować sobie w kodzie własny
alignment(nie wiem jak to napisać po polsku)


@QBA__: Wyrównanie. Na maszynach o magistrali danych np. 32 bity ale mogącej adresować pojedyncze bajty możesz zapisać uint32 i uint8 w tym samym miejscu, jeśli np. mają wartość zero ale z jakiegoś powodu jedno zero powinno być bajtem a nie longiem.