Ich arbeite an einem kompakten Dienstprogramm für Debug-Ausgaben / Komponententests, das auf eingebetteten Systemen verwendet werden soll.
Ich habe ein System geschaffen, mit dem ich Nachrichten über eine serielle Schnittstelle kompakt auf den PC ausgeben kann. Um Speicherplatz / serielle Port-Bandbreite zu sparen, habe ich Nachrichten-Strings vom eingebetteten System entfernt, indem ich ihnen eindeutige 16-Bit-IDs gebe.
Das war ziemlich einfach, weil ich alle Nachrichten in eine Liste gesetzt habe. Einige Makros würden dies in eine Aufzählung aufnehmen:
projectdefs.h:
%Vor%messages.h:
%Vor%Die einzigen Daten, die über die serielle Schnittstelle übertragen werden, sind die Nachrichten-ID, die Zeilennummer und die Dateinummer (Anmerkung; keine Zeichenfolge!).
Das Problem, das ich habe, ist, wie ich jeder Datei mit dem C Präprozessor / Compiler eine eindeutige ID zuweisen kann. Ich möchte nicht jede Dateinamenszeichenfolge im eingebetteten Programm speichern. Dies verwendet (zu viel) Speicher oder Bandbreite an der seriellen Schnittstelle.
Meine Idee ist es, die Konstante file_number in jeder Datei mit einem Makro zu definieren. Ich würde diese Definition am Anfang jeder Quelldatei verwenden:
%Vor% Da jedoch jede Datei separat kompiliert wird, bedeutet dies, dass die __COUNTER__
-Anweisung immer bei 0 beginnt, wenn sie aufgerufen wird, und nicht das Vorhandensein anderer Dateien oder ihre eigene ID kennt.
Eine weitere Überlegung war, das MakeFile (Skript) zu bearbeiten und dort Datei-ID-Nummern hinzuzufügen. Dies würde jedoch die Build / Funktionalität des Projekts eng an meine IDE-Konfiguration binden, was nicht wünschenswert ist. Darüber hinaus bin ich unsicher über die Möglichkeit mit meinen aktuellen IDEs (XC16 / XC32 Compiler auf Mplab X IDE oder IAR Embedded Workbench).
Ich frage mich, ob es andere kreative Möglichkeiten gibt, einen Standardprozessor für C übernehmen zu lassen?
Ich bin mir nicht sicher, ob das Speichern von Quellcode-Dateinamen im Programm für den Speicher so wichtig ist. Wenn Sie sie haben können, dann können Sie eine Variable wie const char *fname = __FILE__;
deklarieren und dann eine Art Prüfsumme, Hash oder CRC berechnen und diesen Wert anstelle des Dateinamens übertragen. Auf der Empfängerseite können Sie den Hash-Wert einem der Dateinamen zuordnen. Sie müssen jedoch sicherstellen, dass die Dateinamen Hashes nicht kollidieren.
Ein anderer Ansatz wäre, Ihre makefiles oder perl oder etwas zu verwenden, um einen Dateizähler zu pflegen und ihn als Makro in gcc, z.B. gcc [someparams1] -DFILENUMBER=%FILECOUNTER% somefile.c [someparams2]
, wobei %FILECOUNTER%
für jeden Ausdruck steht, der als Text in den Wert der Dateizählervariable expandiert. Möglicherweise müssen Sie hier eine festgelegte Reihenfolge der Quelldateikompilierung einführen.
Sie könnten die beiden Methoden kombinieren und gcc mit dem Hash anstelle des Zählers, z.B. -DFILENAMEHASH=%HASH%
, wobei %HASH%
auf eine numerische Konstante erweitert wird, die Ihre Kompilierungsskripts basierend auf dem Dateinamen generieren würden.
Haben Sie überlegt, eine 16-Bit-Hash-Nummer basierend auf dem, was Sie von FILE erhalten, zu erstellen? Es ist vielleicht nicht perfekt (lesen Sie Kollisionen), aber wenn es gut genug für Ihre Bedürfnisse sein könnte. Wenn dies akzeptabel ist, benötigen Sie eine externe Nachschlagetabelle, damit Sie Ihre Hash-Nummer-ID der fraglichen Datei zuordnen können.
Ich hoffe, diese Idee hilft.
Tags und Links c embedded c-preprocessor