Forum: Mikrocontroller und Digitale Elektronik File in µC Code einbinden


von Ulf B. (btb)


Lesenswert?

Hallo!

Ich möchte den Inhalt eines hex-Files in meinen C code so einbinden, 
dass ich auf das File innerhalb eines µC zugreifen kann. Der Zugriff 
braucht dabei nicht dynamisch ablaufen. Sprich: Der Inhalt des hex-Files 
steht schon zur Compilezeit fest.
Als IDE verwende ich IAR, falls das eine Rolle spielen sollte.


Hat da jemand einen Hinweis, wie das funktioniert?


VG

Ulf

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Schade, das du nicht schreibst, um was für einen MC es geht. Bei einem 
AVR deklariere ich ein Array als
1
const PROGMEM uint8_t myArray[LENGTH_OF_MYARRAY] = { 0x00,0x01,0x02...
2
};
und inkludiere es.
Beim STM32 kann ich mir 'const PROGMEM' sparen.

von Peter II (Gast)


Lesenswert?

Matthias S. schrieb:
> Schade, das du nicht schreibst, um was für einen MC es geht. Bei einem
> AVR deklariere ich ein Array als

dann muss man die Datei aber immer noch umwandeln.

sinnvoller ist es aus der Datei ein Objekt file zu machen und es dann 
einfach mit zu linken.

Aber wie das bei IAR - keine Ahnung.

von Ulf Brandner (Gast)


Lesenswert?

Hallo!

Es handelt sich um einen STM32.

VG

Ulf

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Peter II schrieb:
> dann muss man die Datei aber immer noch umwandeln.

Das sollte mit einem Konverter nicht so schwierig sein. Hex2Bin ist 
Standard und dann kann man sich z.B. sowas hier zusammenkloppen oder 
einen Online Konverter suchen:
http://lua-users.org/wiki/BinToCee

Wenn das nur ein paar Bytes sind, auch händisch - wir wissen ja nicht 
mal, wie lang das Hex File ist...

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Schreib Dir ein Programm für den PC, welches das Hex-File in ein 
Include-File mit der Syntax
1
const PROGMEM uint8_t myArray[LENGTH_OF_MYARRAY] = { 0x00,0x01,0x02...
2
};

konvertiert. Fertig.

von Ulf Brandner (Gast)


Lesenswert?

Danke!

Gute Idee.

von Peter II (Gast)


Lesenswert?

Matthias S. schrieb:
> Das sollte mit einem Konverter nicht so schwierig sein. Hex2Bin ist
> Standard und dann kann man sich z.B. sowas hier zusammenkloppen oder
> einen Online Konverter suchen:
> http://lua-users.org/wiki/BinToCee
>
> Wenn das nur ein paar Bytes sind, auch händisch - wir wissen ja nicht
> mal, wie lang das Hex File ist...

naja, andere Passen sich einfach ihr Makefile an, damit alle *.bin 
Dateien mit gelinkt werden und brauchen dann nichts mehr von Hand zu 
machen.

von Klaus W. (mfgkw)


Angehängte Dateien:

Lesenswert?

Frank M. schrieb:
> Schreib Dir ein Programm für den PC, welches das Hex-File in ein
> Include-File mit der Syntaxconst PROGMEM uint8_t
> myArray[LENGTH_OF_MYARRAY] = { 0x00,0x01,0x02...
> };
>
> konvertiert. Fertig.

Noch fertiger im Anhang...

von Igori (Gast)


Lesenswert?

Das Konvertierungsprogramm kann man sehr gut mit Java-Script schreiben 
und im Browser laufen lassen. Per Copy & Paste kann man die Ausgabe des 
Browsers dann in das Zielprogramm übertragen.

von pipapo (Gast)


Lesenswert?

Frank M. schrieb:
> Schreib Dir ein Programm für den PC, welches das Hex-File in ein
> Include-File mit der Syntax

unter Linux gibt es xxd

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Klaus W. schrieb:
> Noch fertiger im Anhang...

:-)

Wenn ich richtig gelesen habe, hat der TO eine Hex-Datei und keine 
Bin-Datei. Dafür ist bin2c.cpp ungeeignet.

pipapo schrieb:
> unter Linux gibt es xxd

Wenn es sich um eine Hex-Datei im Intel-Hex-Format - wovon ich stark 
ausgehe - handelt, ist xxd ebenso ungeeignet.

Man muss die Datei schon interpretieren: Links eine Datensatzmarkierung, 
danach eine Längeninformation und der Offset, dann der Datentyp des 
Records, dann die Daten selbst und rechts eine CRC, die in den Nutzdaten 
nichts zu suchen hat.

Ich habe mal so ein C-Programm (f. Linux und Windows) geschrieben, 
welches ich für diverse Bootloader verwende. Wenn Ulf daran interessiert 
ist, kann er sich ja melden. Oder es selbst machen - so schwierig ist 
das nicht.

Das Format ist hier erklärt:

   https://de.wikipedia.org/wiki/Intel_HEX

von pipapo (Gast)


Lesenswert?

Frank M. schrieb:
> Das Format ist hier erklärt

Samt Link zu

http://sourceforge.net/projects/intelhex2bin/

Manchmal hilft es, sich umzuschauen.

von Peter D. (peda)


Lesenswert?

Man kann auch ganz einfach beide Hexfiles zusammen kopieren. Man muß nur 
vom ersten den Enderecord löschen, z.B. mit findstr.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Man kann auch ganz einfach beide Hexfiles zusammen kopieren.

Ja, wenn die darin verwendeten Adress-Offsets sich nicht überschneiden.

Der TO schweigt sich aber leider über die Art und den Inhalt der 
Hex-Datei komplett aus.

> Man muß nur vom ersten den Enderecord löschen, z.B. mit findstr.

Jepp.

von Ulf Brandner (Gast)


Lesenswert?

Hallo!

Die Hex Datei enthält den Code, den ich von µC1 über SPI zum Bootloader 
von µC2 schicken möchte.

VG

Ulf

von Peter D. (peda)


Lesenswert?

Ulf Brandner schrieb:
> Die Hex Datei enthält den Code, den ich von µC1 über SPI zum Bootloader
> von µC2 schicken möchte.

Sags doch gleich, Du willst eine merge.hex aus boot + app.
1
findstr /V ":00000001FF" boot.hex >merge.hex
2
copy merge.hex+app.hex merge.hex

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Ulf Brandner schrieb:

> Die Hex Datei enthält den Code, den ich von µC1 über SPI zum Bootloader
> von µC2 schicken möchte.

Dann gehts auf jeden Fall nicht mit dem Zusammenkopieren. Da sind 
Adressüberschneidungen (Code µC1 <--> Code µC2) auf jeden Fall gegeben.

Also entweder:

  - erst oben genanntes hex2bin
  - dann oben gezeigtes bin2c

verwenden oder das Programm selber schreiben.

von Peter D. (peda)


Lesenswert?

Frank M. schrieb:
> Dann gehts auf jeden Fall nicht mit dem Zusammenkopieren. Da sind
> Adressüberschneidungen (Code µC1 <--> Code µC2) auf jeden Fall gegeben.

Beim AVR sind jedenfalls Bootloader und Applikation in getrennten 
Flashbereichen, d.h. es überschneidet sich nichts.

Warum sollen sich beim ARM beide überschneiden, bzw. wie soll das 
überhaupt gehen, wenn Applikation und Bootloader sich gegenseitig 
überschreiben?

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter D. schrieb:
> Warum sollen sich beim ARM beide überschneiden, bzw. wie soll das
> überhaupt gehen, wenn Applikation und Bootloader sich gegenseitig
> überschreiben?

Weil Du es nicht verstanden hast:

µC1 soll µC2 flashen. In µC2 ist also ein Bootloader, ok.

Aber in µC1 steckt schon eine Applikation, nämlich die Senderoutine, um 
die zu flashenden Daten von µC1 nach µC2 zu schicken. Daher ist es mit 
hoher Wahrscheinlichkeit nicht möglich, die Applikation für µC2 in µC1 
1:1 zu speichern. Die Daten müssen in µC1 versetzt abgelegt werden.
1
    µC1                       µC2
2
----------------        ----------------
3
| Senderoutine |   +--> | Data f. µC2  |
4
|              |   |    |              |
5
| Data f. µC2  |---+    |              |
6
|              |        |              |
7
|              |        | Bootloader   |
8
----------------        ----------------

Wenn Du also die beiden Hex-Dateien (µC1 Programm 1 + Data für µC2 = 
Programm 2) zusammenkopierst, hast Du eine Überschneidung.

von Peter D. (peda)


Lesenswert?

Frank M. schrieb:
> µC1 soll µC2 flashen

Sorry, das hatte ich überlesen.
Vergiß meinen Post.

von Karl H. (kbuchegg)


Lesenswert?

Igori schrieb:
> Das Konvertierungsprogramm kann man sehr gut mit Java-Script schreiben
> und im Browser laufen lassen. Per Copy & Paste kann man die Ausgabe des
> Browsers dann in das Zielprogramm übertragen.

Keine gute Idee.
Denn sinnvollerweise wird man den Konvertierschritt mit ins makefile 
einbauen.

von Karl H. (kbuchegg)


Lesenswert?

Frank M. schrieb:

> hoher Wahrscheinlichkeit nicht möglich, die Applikation für µC2 in µC1
> 1:1 zu speichern.


Versteh ich nicht. Warum soll das nicht gehen.
Die Applikation für µC2 ist aus Sicht des µC einfach nur ein Array aus 
Bytes, welches er 1:1 an den Bootloader in µC2 weitergibt. µC1 soll 
dieses Programm ja gar nicht ausführen.

>
1
>     µC1                       µC2
2
> ----------------        ----------------
3
> | Senderoutine |   +--> | Data f. µC2  |
4
> |              |   |    |              |
5
> | Data f. µC2  |---+    |              |
6
> |              |        |              |
7
> |              |        | Bootloader   |
8
> ----------------        ----------------
9
>

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Karl H. schrieb:
> Versteh ich nicht. Warum soll das nicht gehen.

Ja, als const-Array geht das. Es ging aber hier um das Zusammenkopieren 
zweier Hex-Dateien, wie Peter es vorschlug:

       Applikation-fuer-uC1.hex
     + Applikation-fuer-uC2.hex

Diese beginnen aber beide an derselben Adresse im Flash. Das geht dann 
natürlich nicht.

von c-hater (Gast)


Lesenswert?

Igori schrieb:

> Das Konvertierungsprogramm kann man sehr gut mit Java-Script schreiben
> und im Browser laufen lassen. Per Copy & Paste kann man die Ausgabe des
> Browsers dann in das Zielprogramm übertragen.

Sarkasmus pur. Danke.

Man könnte es natürlich noch weiter treiben, so weit, dass selbst die 
Dümmsten merken, dass hier etwas völlig ausser Kontrolle geraten ist...

Oder meintest du das etwa gar im Ernst?

von sebastian (Gast)


Lesenswert?

Frank M. schrieb:
> Schreib Dir ein Programm für den PC

Braucht man nicht selber schreiben, srec_cat kanns schon.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

sebastian schrieb:
> Braucht man nicht selber schreiben, srec_cat kanns schon.

Schönes Programm... ja, damit sollte es gehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.