top of page

Manipulare Fisiere Binare

Actualizată în: 16 feb. 2018

In foarte multe cazuri in proiectele de embedded software rezultatul procesului de build nu este un singur binar. Motivele sunt multe:

  • clientul doreste diferite variante ale softului cu mici modificari. Deci cate un binar pentru fiecare varianta a soft-ului.

  • soft-ul final este compus din diferite binare cum ar fi bootloader, applicatie, binar pentru configurari, binar pentru calibrari.

Am avut ocazia sa vad proiecte in care existau pana la 20 de fisiere binare care trebuiau combinate in diferite feluri pentru a obtine produsul final.


O alta problema in cazul fisierelor binare sunt datele ce trebuie introduse in binar la anumite adrese dupa ce acesta a fost construit.Exemple sunt:

  • CRC

  • Data si ora cand produsul a fost asamblat.

  • Data si ora cand soft-ul a fost scris

Ultimele doua situatii se intalnesc frecvent pe linia de productie.


O ultima situatie ce o voi aminti pentru manipularea de fisiere binare este umplerea cu illegal opcode. Orice software scris pe orice microcontroller poate ajunge in anumite situatii sa execute instructiuni in zone de memorie ce nu au fost destinate pentru asa ceva. Un jump gresit,o exceptie netratata poate duce program counter-ul la adrese de memorie ce nu au valoare in binar-ul construit.


Daca binarul final nu contine valori la adresa ce se va executa din greseala soft-ul poate executa instructiuni aleatoare din memorie. Acele zone de memorie nefolosite trebuie scrise cu valoari de illegal opcode astfel incat microcontrollerul sa se reseteze sau sa ajunga intr-o rutina de tratare a exceptiei.


Una dintre solutii este ca atunci cand se scrie soft-ul, echipamentul sa fie destul de inteligent incat sa scrie illegal opcode in zonele libere.


Insa nu ne putem baza pe echipamentul cu care soft-ul va fi scris. Din cauza asta este bine sa umplem noi zonele libere ale binarului cu un illegal opcode(de obicei valoarea 0xFF).


In momentul in care am intalnit astfel de situatii, ca orice inginer adevarat, am spus “cat de greu poate fi sa scriu ceva script care sa manipuleze binare”.


In realitate este destul de greu pentru ca sunt foarte multe formate de binare si sunt foarte multe operatii ce se pot executa pe ele.


SRecord


In continuare voi prezenta 3 programe exceptionale scrise de 2 domni: Scott Finneran si Peter Miller.


Programele se numesc srec_cat, srec_info si srec_cmp. Sunt open source si pot fi obtinute de pe internet (vezi linkuri-le de la final).


Toate cele 3 programe nu au interfata grafica (nici nu au nevoie) fiind folosite din linia de comanda. De asemenea codul sursa al celor 3 se poate gasi usor (vezi link-uri de la final).


Lista de formate binare suportate de cele 3 este cu adevarat impresionanta. Inainte sa gasesc aceste programe nu stiam ca exista chiar atat de multe.


srec_info este un utilitar pentru afisarea de informatii despre un binar (address range, binary type, … etc).

srec_cmp este un utilitar pentru comparat binare. Comparatia se face la nivel de adrese si este foarte utila.

srec_cat este calul de bataie al celor 3 si este folosit pentru manipularea binarelor.


Documentatia completa pentru cele 3 binare o puteti gasi in link-urile de la final.


In continuare vreau sa prezint cateva exemple de operatii care le poate face srec_cat.


Concatenare Binare

Srec_cat poate concatena oricate fisiere binare se doresc intr-o singura instructiune.Formatele fisierelor binare pot fi diferite intre ele.

De exemplu daca avem 2 binare:

  • my_binary.s19 de tipul motorola srecord

  • my_binary.hex de tipul intel

si dorim sa obtinem in final un binar in formatul intel.


srec_cat.exe my_binary.s19 --motorola my_binary_2.hex --intel -o final_binary.hex --intel


Fill

Pentru a umple cu o anumita valoare zone de memorie din binar:


srec_cat.exe my_binary.s19 --motorola ---fill 0xFF 0x0FFFF 0x1FFFE -o final_binary.s19 --motorola


Comanda de mai sus va umple zona de memorie intre 0x0FFFF pana la 0x1FFFE cu valoarea 0xFF.


Calcul CRC

Pentru a calcula si insera un CRC in binar:


srec_cat.exe my_binary.s19 --motorola -CRC16_Little_Endian 0x1FFFE -o final_binary.hex


Exemplul de mai sus calculeaza CRC CCITT 16 biti LE peste intreb binarul si va insera rezultatul la adresa 0x1FFFE.


Scripturi

Toatea operatiile de mai sus pot fi combinate intr-o singura instructiune din linia de comanda sau pot fi scris in fisiere cu extensia *.srec ce pot fi date ca parametru catre srec_cat.exe


srec_cat.exe my_binary.s19 --motorola fill 0xFF 0x0FFFF 0x1FFFE -CRC16_Little_Endian 0x1FFFE my_binary_2.hex --intel -o final_binary.hex --intel


Exemplul de mai sus va lua fisierul my_binary.s19 de tip srecord si va umple zona de la adresa 0x0FFFF pana la 0x1FFFE cu valoarea 0xFF.

Dupa care va calcula un CRC CCITT LE peste toate datele(inclusiv valorile de 0xFF introduse) si va insera valoarea la adresa 0x1FFFE.Rezultatul va fi concatenat cu fisierul my_binary_2.hex de tip intel si pus in fisierul final_binary.hex.


Aceste scurte exemple sunt nimic comparativ cu tot ce pot aceste programe. Va rog cititi documentatia si incercati-le. Nu veti regreta.


Linkuri Utile

89 afișări0 comentarii

Postări recente

Afișează-le pe toate

Calea catre main() - intro

In liceu am invatat ca un program incepe de la main(), acest lucru fiind valabil in mai multe limbaje de uz intens. De ce main()? Ce-i...

Comments


bottom of page