2013-01-16 3 views
8

Ich arbeite an einem eingebetteten Gerät, und es gibt Code, der ursprünglich mit dem IAR-Compiler kompiliert wurde.Was ist die "__IO" -Richtlinie in GCC?

Ich versuche, diesen Code mit dem GCC-Compiler zu rekompilieren.

Es gibt eine bestimmte Aussage: typedef __IO, die einfach nicht kompiliert wird ("Unerkannter Symbolfehler").

Könnte jemand vorschlagen, wie ich diese Anweisung richtig kompilieren könnte?

+2

'#define __IO volatile' oder auch nur' #define __IO ' –

+0

@ Eddy_Em: Post Antworten als Antworten nicht als Kommentare. – Clifford

+1

Wenn es ein unerkanntes Symbol ist, wie weißt du, dass es ein typedef ist? (es ist nicht). Einige Beispiele für den Code, auf den Sie sich beziehen, könnten nützlich sein. – Clifford

Antwort

10

Wenn dies nicht erkannt wird, liegt dies daran, dass kein entsprechender Systemkopf mit der Definition enthalten ist.

Es wird in der Chip-Support-Header-Datei definiert, die mit der Toolchain zur Verfügung gestellt wird. Es ist Typqualifizierer oder eher ein Makro (#define), das zu einem Typqualifizierer erweitert wird. Es wird beispielsweise wie folgt verwendet:

__IO uint8_t CSSR; 

Hier uint8_t ist die Art, so __IO kann nicht in der Tat ein typedef sein, weil es nicht verwendet wird, wo 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 E/A Speicher zugeordnet ist, wird es einfach auf volatile erweitert, da alle E/A als flüchtig deklariert werden sollten, um sicherzustellen, dass explizite Zugriffe nicht optimiert werden.

Wenn Sie sicher sein möchten, laden Sie eine Demoversion der IAR-Tools herunter und schauen Sie in den Header-Dateien nach, wie sie für Ihre spezielle Architektur definiert sind. Sonst könnten Sie einfach #define __IO volatile

7

_IO Bedeutung volatile wie in C Sprache ... verwenden, die den Code nicht optimieren und in dem Wert für die Variable mit _IO angegeben wird unvorhersehbar sein oder wird ohne Kenntnis von Compiler und Benutzer ändern

1

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 wird __IO definiert als für Cortex-m4 folgt:

#define  __IO volatile    /*!< Defines 'read/write' permissions */ 

Der vollständige Block wird unten (Source) Kopie eingefügt:

#ifdef __cplusplus 
    #define __I  volatile    /*!< Defines 'read only' permissions */ 
#else 
    #define __I  volatile const  /*!< Defines 'read only' permissions */ 
#endif 
#define  __O  volatile    /*!< Defines 'write only' permissions */ 
#define  __IO volatile    /*!< Defines 'read/write' permissions */ 

/* following defines should be used for structure members */ 
#define  __IM  volatile const  /*! Defines 'read only' structure member permissions */ 
#define  __OM  volatile   /*! Defines 'write only' structure member permissions */ 
#define  __IOM volatile   /*! Defines 'read/write' structure member permissions */