Forum: Mikrocontroller und Digitale Elektronik Berechnung Checksumme im makefile


von Steffen W. (surrounder)


Lesenswert?

Hallo Forum,

ich habe hier im Forum schon Beiträge zu dem Thema gelesen, leider hat 
mir bisher keiner weiter geholfen.

Ich muss über meinen Maschinencode eine CRC16 Checksumme berechnen. Da 
der GNU Compiler das nicht kann, habe ich mir eine extra Sektion 
definiert und schreibe dort eine Variable beim ersten Linken mit "0", 
berechne dann meine Checksumme und linke dann nochmals mit dem Wert der 
Checksumme.

Vom Ablauf her sit mir das alles auch klar, und würde prinzipiell auch 
funktionieren. Nun habe ich ein kleines Konsolenprogramm das mit die 
CRC16 CCITT  Checksumme berechnet (rehash), nur wie kann ich das was nun 
als Berechnung herauskommt in meinem makefile einlesen? Hat mir jemand 
einen Tip oder ein anderes Programm zum berechnen der Checksumme mit dem 
das geht?

Aktuell habe ich das über ein extra Batchfile versucht, aber leider 
steht mir dann nach dem beenden des Batchfiles die Variabel mit makefile 
wieder nicht zur Verfügung. Danke für jeden Tip

BATCHFILE: (funktioniert so, aber leider ist die Variable dann im 
makefile weg)

rehash .\Objects\htb.elf -norcrsv -none -crc16c > output.txt
@echo off & setLocal EnableDelayedExpansion
FOR /F "skip=1 delims=: tokens=2, 3*" %%i in (output.txt) do set 
crc16=%%i
echo !crc16!

von Karl H. (kbuchegg)


Lesenswert?

Steffen Walter schrieb:

> Aktuell habe ich das über ein extra Batchfile versucht, aber leider
> steht mir dann nach dem beenden des Batchfiles die Variabel mit makefile
> wieder nicht zur Verfügung. Danke für jeden Tip

Deinem make ist es ja prinzipiell egal, mit welchem Kommando es aus den 
Einzelteilen das EXE erstellt.
Alles was das make interessiert:
Um aus dem im Makefile angegebenen Einzelteilen das fertige Programm zu 
erhalten, muss das im Makrfile angegebene Kommando ausgeführt werden.
Das Kommando kann natürlich auch ein Batch-File sein, welches die CRC 
berechnet, einträgt und das EXE linkt.

von B. J. (bjue)


Lesenswert?

Hallo Steffen,
ein Weg wäre:
Du rufst nach wie vor Dein Rehash auf:
rehash .\Objects\htb.elf -norcrsv -none -crc16c > output.txt
--> rehash schreibt in die Datei output.txt z.B. die Zeile
"MeineCRC  db  1234h"         (db = define byte)

Diese Datei bzw. diese Zeile includest Du in Dein Source Modul mit der 
extra Section:

Datei "MeinCrCSourceModul":
MeineCRCSection SECTION DATA Word
#include(output.txt)
MeineCRCSection ENDS

In Deinem Make rufst Du also auf:
rehash...
assemble (oder compile) MeinCrcSourceModul...

LINK ..,MeinCrcSourceModul,..

Syntax etc. hängt natürlich von Deiner Umgebung ab. Ich bin jetzt mal 
von Assembler ausgegangen, in C geht es natürlich ähnlich. Auf so eine 
ähnliche Weise hole ich mir u.a. auch das aktuelle Erstelldatum in 
meinen Sourcecode.

von Steffen W. (surrounder)


Lesenswert?

Danke erst einmal für Eure schnellen Antworten.

Zum Thema alles was make interessiert: mein batchfile funktioniert ja, 
das habe ich ja gestestet und im Batchfile oder in einer 
Eingabeaufforderung habe ich dann auch die Variabel mit der CRC 
Checksumme zur Verfügung. Wenn ich das Batch dann über das makefile 
ausführe dann habe ich aber die Variable nicht mehr zur Verfügung! Ich 
kann also auf den extrahierten Wert crc16 nicht mehr zugreifen.


Das mit dem include der Textdatei ist mir noch nicht ganz klar, ich muss 
ihm dann quasi sagen in welche Section er mit das einbinden soll? Dann 
muss ich aber doppelt Compilieren und Linken oder?

Ich hatte das bisher über den Linker mit --defsym gemacht und mir da 
dann das Ergebnis der CRC Berechnugn gesetzt (bisher manuell von Hand) 
und das wollte ich eben nun automatisieren. Gibt es denn keine 
Möglichkeit von einem DOS Programm direkt auf die Ausgabe zuzugreifen?

von B. J. (bjue)


Lesenswert?

Steffen Walter schrieb:
> Das mit dem include der Textdatei ist mir noch nicht ganz klar, ich muss
> ihm dann quasi sagen in welche Section er mit das einbinden soll? Dann
> muss ich aber doppelt Compilieren und Linken oder?

Doppelt nicht, sondern nacheinander!
Nachdem Du die CRC mit rehash in die Datei output.txt geschrieben hast,
wird das Modul mit der Section, in der auch die CRC landen soll, 
compiliert. (Ich gehe dabei davon aus, das die Section mit der 
berechneten CRC nicht im gleichen Source Code Modul steht, über das die 
CRC gebildet werden soll).
Beim Compilieren wird mit der include Anweisung die Datei output.txt in 
Dein Modul eingefügt.
Das Nacheinander kann man doch über die Abhängigkeiten im Makefile 
steuern.
Anschliessend wird alles gelinkt.

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.