in der Header-Datei core_cm4.h ist so etwas definiert:
#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 */
Was ist der Unterschied zwischen __I , __O und __IO, obwohl sie auf die gleiche Weise definiert sind?
"I" bedeutet: Eingang
"O" bedeutet: Ausgang
"IO" bedeutet: Eingang und Ausgang
Wie Long Pham feststellt, handelt es sich um eine Namenskonvention, aber es ist auch normal, Bedeutungen für einen Typ zu verwenden. Wie eine Ganzzahl kann ein Zähler, ein Zeitstempel, ein Datum usw.
Es gibt einige Gründe, dies zu verwenden:
Da dies für die Definition einer Hardware-Registerkarte gilt:
Ich denke, der Grund ist, dass C im Gegensatz zu C++ die Deklaration const
qualifizierter Variablen zulässt, ohne einen Initialisierer bereitzustellen:
volatile const uint32_t REG; // Ok in C, invalid in C++
In ähnlicher Weise erlaubt C++ auch nicht, dass const
Member von struct/classes nicht initialisiert werden. Dies ist unpraktisch, wenn wir schreibgeschützte Hardwareregister haben und eine Registerzuordnung mithilfe von Strukturen (Klassen) erstellen möchten.
Diese Einschränkung der C++-Sprache ist wahrscheinlich der Grund, warum dieser Header einen schmutzigen Hack verwendet, #ifdef __cplusplus
um aus einem Register zu entfernen const
, das hätte const
qualifiziert werden sollen.
Diese Header-Datei wurde erstellt, um auch C++ zu unterstützen,
Daher wird im Fall von C die konstante Variable als Konstante bezeichnet und kann vom Benutzer nicht geändert werden. Es gibt jedoch keine weitere Optimierung für diese konstante Variable durch den C-Compiler.
Aber im Fall von C++ kann diese konstante Variable durch den konstanten Wert ersetzt werden, der dieser Variablen zugewiesen ist.
Im Fall von c++ sind Strukturmember-Variablen nicht optimiert, daher kann dort const verwendet werden.
Daher stellt diese Header-Datei __I ,__O , __IO für die skalaren Variablen und
__IM ,__OM ,__IOM für die Strukturmitglieder bereit.
Lange Pham