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?

J.M.
źródło
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ę.

SF.
źródło
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.

Olin Lathrop
źródło