Frage

Ich Schreibe firmware für einen PIC32MX, mit HiTech PICC32.Eines der Probleme, die ich vermeiden möchte ist, dass, da die meisten pins haben mehrere Namen (zB.AN0 = RB0 = CN2 = PGED1), ich oder jemand anderes versehentlich RB0, ohne zu bemerken, dass AN0 wird bereits verwendet.(Dies kann wirklich katastrophal sein, da eine falsche Konfiguration eines Analog - /digital pin kann dazu führen, übermäßige Stromaufnahme und die Freisetzung von ätherischen Rauch.)

Sowie umfassend dokumentieren jeden Stift benutzt, ich Frage mich, ob es einen schnellen Weg, um Kopf zu dieser Frage aus-auf der Ebene der Codierung.Ich möchte ein makro, dass Menschen (vor allem mich) verwenden können, sagen Sie CLAIM_PIN(58),, die eine Warnung oder einen Fehler, wenn es zweimal ausgeführt wird.

(Ich will nicht, dass es unter allen Umständen, wenn die einzig mögliche Lösung ist zu horrenden oder wartbaren, dann werde ich es vergessen und entwickeln gerade einen Ruf in Tränen auszubrechen oder das setzen mich auf Feuer oder so etwas.Ich sah auch dieser Frage nach makro Makros zu produzieren, die Regeln, dass.)

Ich sollte klarstellen:der code geschrieben IST, in mehreren compilation-Einheiten (mindestens, ich denke, das ist es, was der Satz bedeutet).Ich habe eine .h/.c-Datei für meine A2D-code, ähnlich für die SPI -, und ähnlich für die verschiedenen Peripheriegeräte, die nur bestimmte I/O-ports.Raum ist nicht wirklich ein problem, mein code lässt viel Raum auf der PIC32MX;auch ich kann mit einem anderen __DEBUG-flag zu entfernen Sie die pin-code überprüfen, der für eine endgültige Verwendung.

War es hilfreich?

Lösung

Ok, hier.Keine runtime-Kosten.

#define CLAIM(n) struct busy##n {}

CLAIM(58);
CLAIM(58);

Wenn zweimal ausgeführt wird, wird ein Fehler ausgegeben:

z.c:4: error: redefinition of ‘struct busy58’

Zu verlängern die check mehreren compilation-Einheiten, die Sie wollen, wickeln Sie das makro in #if DEBUG da würden wir mit dem linker zu erkennen, die aufeinandertreffen und daher würde haben eine Laufzeit-Fußabdruck.

#define CLAIM(n) char busy##n = 1;
#define CLAIM(n) void busy##n() {} // bdonlan

Andere Tipps

#define CLAIM_PIN(n) char claimed_pin_##n;

Nun, wenn zwei Stücke von code versuchen, zu behaupten, ein pin ist, wird das symbol doppelt definiert und entweder der compiler oder der linker einen Fehler erzeugen.

Edit: Basierend auf Kommentare, diese vielleicht besser:

#define CLAIM_PIN(n) void claimed_pin_#nn(void) {}

Wenn Sie sich leisten können, den Laufzeit-overhead oder ob dies nur für das Debuggen, würde ich erstellen Sie einfach so etwas wie eine IOPinOpen() Funktion, bleiben die pins in verwenden, statt sich mit der makro-Tricks.

Auf der anderen Seite, Mark Lösegeld aktualisierte Antwort war Wert +1.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top