Ich habe an einer Reihe von verschiedenen eingebetteten Systemen gearbeitet. Sie haben alle typedef
s (oder #defines
) für Typen wie UINT32
verwendet.Wann sollte ich Typ Abstraktion in eingebetteten Systemen verwenden
Dies ist eine gute Technik ist, wie es zu Hause die Größe des Typs für den Programmierer treibt und macht Sie bewusst die Chancen für Überlauf usw.
Aber auf manchen Systemen wissen Sie, dass der Compiler und Prozessor wird nicht Änderung für das Leben des Projekts.
Was also sollte Ihre Entscheidung beeinflussen, projektspezifische Typen zu erstellen und durchzusetzen?
EDIT Ich denke, ich habe es geschafft, den Kern meiner Frage zu verlieren, und vielleicht sind es wirklich zwei.
Mit Embedded-Programmierung benötigen Sie möglicherweise bestimmte Größen für Schnittstellen und auch mit eingeschränkten Ressourcen wie RAM umzugehen. Dies kann nicht vermieden werden, aber Sie können wählen, die grundlegenden Typen aus dem Compiler zu verwenden.
Für alles andere haben die Typen weniger Bedeutung.
Sie müssen darauf achten, keinen Überlauf zu verursachen und müssen möglicherweise auf die Verwendung von Registern und Stapeln achten. Was Sie zu UINT16
, UCHAR
führen kann. Mit Typen wie UCHAR
kann Compiler 'Fluff' jedoch hinzugefügt werden. Da Register normalerweise größer sind, können einige Compiler Code hinzufügen, um das Ergebnis in den Typ zu zwingen.
i++;kann
ADD REG,1 AND REG, 0xFFwerden, was unnötig ist.
Also ich denke, meine Frage hätte sein sollen: -
die Einschränkungen von Embedded Software gegeben, was ist die beste Politik für ein Projekt zu setzen, die viele Menschen arbeiten daran haben - nicht alle von denen der sein das gleiche Niveau an Erfahrung.
Eine weitere Optimierung, die ich gesehen und geschätzt habe, ist die Verwendung von FIXED-Typen und "USE-BEST" -Typen. , d. H. Typedef unsigned char UINT8 typedef unsigned uint255; UINT 255 gibt den Wertebereich an, lässt aber die optimale Größe pro System angeben – itj
@itj: Statt uint255 verwenden Sie 'uint_fast8_t' aus' stdint.h'. Es ist als schneller Typ definiert, der einen vorzeichenlosen 8-Bit-Wert unterstützen kann. Auf einer Plattform kann das ein "unsignierter Char" sein. Auf einem anderen kann es einfach ein "unsigned int" sein. – tomlogic
Das ist alles in Ordnung, bis Ihr Code auf einem sehr begrenzten Prozessor funktioniert und Sie wollen oder müssen auf einem anderen Prozessor testen, vielleicht weil das Testen und Debuggen auf dem realen Ziel schwierig/unmöglich ist. In dieser Situation müssen Sie auf Ihrem Dev-Host mit Variablen der gleichen Größe wie auf dem Ziel testen, und wenn Sie nicht mit Größen-spezifischen Typedefs codiert haben, wird Ihr Prozess vollständig borken. – barny