Ich arbeite an einem eingebetteten Gerät, und es gibt Code, der ursprünglich mit dem IAR-Compiler kompiliert wurde.
Ich versuche, diesen Code mit dem GCC-Compiler neu zu kompilieren.
Es gibt eine bestimmte Anweisung: typedef __IO
, die einfach nicht kompiliert wird ("Unbekannter Symbolfehler").
Könnte jemand vorschlagen, wie ich diese Anweisung richtig kompilieren könnte?
Wenn es nicht erkannt wird, liegt dies daran, dass ein entsprechender Systemkopf, der die Definition enthält, nicht enthalten ist.
Es wird in der Chip-Support-Header-Datei definiert, die mit der Toolchain bereitgestellt wird. Es ist type qualifier oder vielmehr ein Makro ( #define
), das zu einem Typqualifikator erweitert wird. Es wird zum Beispiel wie folgt verwendet:
Hier ist uint8_t
der Typ, also kann __IO nicht tatsächlich ein typedef
sein, weil er nicht verwendet wird, wenn ein Typ gültig ist. Das __IO-Makro wird entsprechend dem jeweiligen Compiler erweitert, um einen korrekten E / A-Zugriff und eine korrekte Adressierung zu gewährleisten. In dem typischen Fall, in dem I / O speicherabgebildet ist, wird es einfach auf volatile
erweitert, da alle I / O als flüchtig deklariert werden sollten, um sicherzustellen, dass explizite Zugriffe nicht optimiert werden.
Wenn Sie sicher sein möchten, laden Sie eine Demo-Version der IAR-Tools herunter und schauen Sie in den Header-Dateien nach, wie sie für Ihre spezielle Architektur definiert sind. Andernfalls könnten Sie einfach #define __IO volatile
Dies ist eine alte Frage, aber falls jemand dies für ARM-Mikrocontroller wissen möchte, können Sie sehen, dass die Definition in der CMSIS-Bibliothek verfügbar ist. Zum Beispiel ist __IO
für Cortex-m4 wie folgt definiert:
Der vollständige Block wird kopiert ( Quelle ) ):
%Vor%