Was ist die "__IO" -Richtlinie in GCC?

8

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?

    
Chaitannya 16.01.2013, 13:40
quelle

3 Antworten

10

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:

%Vor%

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

verwenden     
Clifford 16.01.2013, 22:42
quelle
7

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

    
Nithin 06.05.2014 09:13
quelle
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 ist __IO für Cortex-m4 wie folgt definiert:

%Vor%

Der vollständige Block wird kopiert ( Quelle ) ):

%Vor%     
Plasty Grove 06.01.2018 15:43
quelle

Tags und Links