2016-07-28 20 views
-3

Könnte jemand erklären, was die Zeile static volatile GPIO_Registers* const gpio[] in dem Code unten ist?c Verständnis struct Zeiger

und was macht die Syntax (volatile GPIO_Registers*) in diesem Block?

// GPIO hardware registers 
// 
typedef struct 
{ 
    uint32_t MODE; 
    uint32_t TYPE; 
    uint32_t SPEED; 
    uint32_t PUSH_PULL; 
    uint32_t IDR; 
    uint32_t ODR; 
    uint32_t BSRR; 
    uint32_t LOCK; 
    uint32_t ALT_FN1; 
    uint32_t ALT_FN2; 
} GPIO_Registers; 


// Ports can be selected using an enumeration 
// (Port) to index into this array. 
// Port addresses can be calculated using the enum since 
// all ports are at the same offset from each other. 
// 
static volatile GPIO_Registers* const gpio[] = 
{ 
    (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10)), 
    (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_B << 10)), 
    (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_C << 10)), 
    (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_D << 10)), 
    (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_E << 10)), 
    (volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_F << 10)) 
}; 
+0

Was haben Sie selbst herausgefunden? Was ** speziell ** verstehst du nicht in deinem C-Buch? – Olaf

Antwort

0

static volatile GPIO_Registers* const gpio[] ein statisches Array von Zeiger auf GPIO_Registers Variablen ist.

Jedes Element des Arrays zeigt auf eine physikalische Adresse Ihres SoC/mcu. Jedes Element zeigt also auf eine physikalische GPIO port. Werfen Sie einen Blick auf Ihr SoC/mcu Datenblatt für Details. Sie werden feststellen, dass jeder GPIO-Port Ihres SoC alle 32-Bit-Register hat, die durch GPIO_Registers struct angegeben sind.

(volatile GPIO_Registers*) ist eine einfache Art Besetzung, die aufgrund der Tatsache erforderlich ist, dass GPIO_BASE_ADDR und andere definiert sind einfache "Zahlen" und Sie müssen den Typ dieser "Zahlen" angeben.

+0

@ downvoter ....? – LPs

0

(volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10)) Leitung mitteilt, dass die Adresse eine Strukturzeiger und volatile. Der Wert an dieser Adresse kann sich jederzeit durch die Hardware ändern.

static volatile GPIO_Registers* const gpio[] Zeile sagt, dass gpio ist konstante Variable Strukturzeiger, volatile und statischen. Der Wert dieses Zeigers ist konstant-flüchtig und befindet sich lokal in der Datei selbst und wird von anderen Dateien im Projekt nicht gesehen. Es ist also static. Als variable beschäftigt sich mit Hardware d.h GPIO, kann der Wert auf dem Sprung ändern, so ist es constant und volatile

+0

"der Wert kann sich unterwegs ändern, also ist es konstant und [...]" ?? –

+0

@KarolyHorvath - Wert des Zeigers, dh die Adresse des GPIO-Registers, ändert sich nicht. Das Ziel des Zeigers, dh die Bits in diesem Register, können. Aber volatile bedeutet nicht, dass das Programm etwas ändern kann, es bedeutet, dass der Compiler den Zugriff tatsächlich ausführen muss, weil etwas anderes es haben kann, oder dass der Zugriff auf die Seite Nebenwirkungen haben kann - obwohl dies hier nicht der Fall ist deklariere sowohl const als auch volatile. –

+0

@ChrisStratton: Ich bin mir dessen bewusst. Ich habe lediglich darauf hingewiesen, dass der Satz keinen Sinn ergibt. –

-1
(volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10)) 

Diese Zeile im Code wirft die Adresse auf ein volatile Structure pointer und den Wert an dieser Adresse in dem kann durch die Hardware geändert werden.