Dostęp do parametrów w pliku HEX (program ECU) przy użyciu pliku A2L


3

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?


Zapomniałem wspomnieć: dane są w notacji Intela (little endian), dla adresu, którego nie znam.
J.M.

Odpowiedzi:


1

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ą.

enter image description here

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ę.


Dzięki za odpowiedź, która naprawdę pomogła. Teraz zacząłem pisać skrypt MATLAB do konwersji danych do pliku binarnego. Jak przekonwertować zestaw danych (cyjan w obrazie przykładowym)
J.M.

@ J.M .: podążanie za specyfikacjami formatu, bez łatwego sposobu lub skrótów wokół niego (chyba że znajdziesz bibliotekę, która może to zrobić).
SF.

Dobra, teraz napisałem skrypt i skończyłem na binarnie z ok. 3,6 miliona bitów. Jak teraz korzystać z adresów, które czytam z A2L? Czy używam na przykład „0x3B0B”? Czy wiesz, do czego służy zarezerwowane „4”?
J.M.

@ J.M .: uh, 3,6 mln kawałki ? Mam nadzieję, że spakowane w bajty, a nie oddzielne znaki „0” i „1”? Cóż, nie znam protokołu XCP, ale teraz, kiedy rozpakowałeś Intel Hex na binarny, przetwarzasz binarnie zgodnie z XCP. Ponadto: 0xA0143B0B jest w rzeczywistości 32 bitami, a nie 64 - każdy znak heksadecymalny reprezentuje 4 bity. Obawiam się, że nie mogę ci w tym pomóc; nigdy nie zrobiłem nic z XCP i nie mam pojęcia, jak go zdekodować.
SF.

tak się oczywiście zmieniło. W tym przypadku muszę zajrzeć do Protokołu XCP. Nie może być tak łatwo, ponieważ plik binarny nie ma tylu bajtów, ile podaje adres. I masz rację co do adresu - w rzeczywistości jest to 32 bity: - /
J.M.

0

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:

000001C0-000001DF (32): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00
000001E0-000001FF (32): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00
00000200-0000021F (32): 54 71 07 80 80 9A 07 80 80 9A 07 80 80 9A 07 80 8C 53 06
  80 00 00 11 A0 14 00 11 A0 00 00 00 00
00000220-0000023F (32): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00
00000240-0000025F (32): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00
00000260-0000027F (32): 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  00 00 00 00 00 00 00 00 00 00 00 00 00

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.