Moi koledzy otrzymali skompilowany program z ECU samochodowego w formacie HEX, a także odpowiedni plik A2L. W moim projekcie muszę odczytać zastosowane parametry z tego pliku HEX. Chcę to zrobić automatycznie, za pomocą funkcji MATLAB, ponieważ parametry są używane jako dane wejściowe w modelu Simulink.
Teraz jako przykład plik HEX wygląda tak:
[…]
:2001C00000000000000000000000000000000000000000000000000000000000000000001F
:2001E0000000000000000000000000000000000000000000000000000000000000000000FF
:2002000054710780809A0780809A0780809A07808C530680000011A0140011A000000000D4
:200220000000000000000000000000000000000000000000000000000000000000000000BE
:2002400000000000000000000000000000000000000000000000000000000000000000009E
:2002600000000000000000000000000000000000000000000000000000000000000000007E
[…]
(proszę zauważyć, że jest to tylko przykładowy fragment)
Adres określonego parametru można odczytać z A2L, na przykład jako ‘0xA0143B0B’
.
Ze specyfikacji protokołu XCP wiem, że adres w A2L jest 40-bitowy (32-bitowy adres i 8-bitowe rozszerzenie).
Jak widać adres, który czytam, jest 64-bitowy.
Teraz, jeśli dobrze to zrozumiałem w moim przykładowym adresie ‘A01’
jest zarezerwowany, ‘4’
to rozszerzenie adresu i ‘3B0B’
jest rzeczywistym 32-bitowym adresem.
Czy ktoś może to potwierdzić lub poprawić, jeśli się mylę?
Czytanie danych z pliku HEX na miejscu ‘3B0B’
jest nieprawidłowe. Moi koledzy wyeksportowali dla mnie dane w pliku tekstowym, aby zweryfikować moje wyniki i wyraźnie się różnią.
Czy „:” liczy się, kiedy adresowane jest stanowisko?
Edytuj: Właśnie się dowiedziałem 'A01'
definiuje segment RAM, w którym zapisywane są dane. Ale jak znaleźć ten segment w pliku HEX?
Odpowiedzi:
To jest Intel hex format, a nie surowy zrzut szesnastkowy - więc nie, pozycja w pliku nie pomoże. Są to rekordy z długością, adresem, typem rekordu, danymi i sumą kontrolną.
Oczywiście w wyniku tego narzutu bajt w pozycji 3B0B w pliku szesnastkowym będzie zupełnie inny. Musisz zdekodować plik Intel Hex na surowy plik binarny (zastosuj przesunięcia / adresy, nagłówki pasków itd. - dane w .hex nie gwarantują ciągłego segmentu pamięci) i tylko tam twój 3B0B wskaże właściwą lokalizację.
źródło
Format Intel HEX jest dobrze udokumentowany. Zasadniczo zawiera kilka bajtów pod określonymi adresami.
Z pewnością istnieje wiele narzędzi, które czytają pliki HEX i robią różne rzeczy z informacjami w nich zawartymi. Na przykład, tutaj jest wyjście mojego narzędzia HEX_DUMP uruchomionego na podanym fragmencie:
To wyjście pokazuje zakres adresów wynikający z każdej linii, liczbę bajtów danych w tej linii, a następnie rzeczywiste bajty danych w HEX.
Co to znaczy dane i co z nimi robisz, oczywiście zależy od ciebie.
źródło