2014-10-19 19 views
8

ich eine Header-Datei in meinem Projekt verwenden, das hatte definieren die folgende (n):Gibt es irgendeinen Grund, etwas "flüchtiges const" in C zu erklären, sondern nur "flüchtig" in C++?

#ifdef __cplusplus 
    extern "C" { 
#endif 

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

Die __I verwendet wird, wie in einer anderen Header-Datei folgt:

typedef struct { 
    // more members before   
     __I uint32_t CR; /*!< GPIO Commit*/ 
    // more members after 

    } GPIOA_Type; 

#define GPIOF_BASE      0x40025000UL 
#define GPIOF       ((GPIOA_Type *) GPIOF_BASE) 

Meine Frage ist, warum sollte die __I const in C gemacht werden, aber nicht in C++? Sie können immer noch den Wert ändern, auf den CR verweist, da Sie die Adresse haben, aber ich bin nur neugierig, warum die Definition von __I anders ist.

Für jeden, der sich, was dies für oder aus, die __I definiert sind von IAR Embedded Workbench ARM Cortex-M4 , und die Struktur ist von Texas Instruments LM4F120H5QR CMSIS Dateien.

+1

In C++ gibt 'const' interne Verknüpfung. Ich weiß nicht, ob es in C ist, aber ich vermute nicht. Beachten Sie jedoch, dass "__I" ein Name ist, der der Implementierung vorbehalten ist und nicht im Benutzercode verwendet werden soll. –

+0

@Mat McNabb Ich meinte, da ich die genaue Adresse des CR-Registers habe, kann ich folgendes tun: #define GPIO_PORTF_CR_R (* ((volatile unsigned long *) 0x40025524)), dann GPIO_PORTF_CR_R = xxxxx, und das ändert den Wert des Registers . – SoftwareDev

+0

@SoftwareDev OK - das 'volatile const CR' bedeutet, dass Sie' CR' nicht verwenden können, um das Register zu ändern; natürlich kann es auf andere Weise modifiziert werden –

Antwort

7

In C++, const Variablen im Dateibereich standardmäßig auf statische Verknüpfung, die für Memory-mapped GPIOs nicht wünschenswert wäre. Der "richtige" Fix dafür ist das extern Schlüsselwort, aber das kann hier nicht verwendet werden, da offensichtlich __I mit Klassenmitgliedern arbeiten muss. So eliminiert const die Standardverknüpfung extern, wie gewünscht.

+0

Wenn dies der Grund ist, würde ich auch bemerken, dass derjenige, der den ursprünglichen Code geschrieben hat, wahrscheinlich "gegabelt" haben sollte, um eine andere Version für Mitgliedsvariablen zu haben als für globale –

+0

@MattMcNabb: Rückblick ist immer 20-20. Die C++ - Unterstützung wurde wahrscheinlich lange nach der Verwendung des Makros im C-Code sowohl für globale als auch für Member hinzugefügt. –

+0

@BenVoigt macht Sinn. Also im Grunde sagte die Person, die diesen Code schrieb: "Es gibt keinen Weg, CR nur in C++ lesen zu lassen, obwohl das das ist, was wir wollen"? Obwohl ich mich eher an die Person lehne, die den C-Code geschrieben hat, kann ich das Datenblatt nicht richtig lesen, weil der Wert des CR-Registers vom Standard abweichen kann. Wenn es nicht geändert werden kann, gibt es keine Möglichkeit, ein Pull-Up zu aktivieren Widerstand in einem der Switches in der Entwicklungskarte verwendet. – SoftwareDev