2016-07-28 141 views
-3

有人可以解釋下面代碼中的行static volatile GPIO_Registers* const gpio[]是什麼?c瞭解結構指針

和這個塊內部的語法(volatile GPIO_Registers*)是做什麼的?

// 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

你弄明白了什麼? **特別是**你不懂C書嗎? – Olaf

回答

0

static volatile GPIO_Registers* const gpio[]是指針的靜態陣列GPIO_Registers變量。

陣列的每個元素都指向您的SoC/mcu的物理地址。所以每個元素指向一個物理GPIO port。查看您的SoC/mcu數據表以瞭解詳細信息。您會發現SoC的每個GPIO端口都具有由GPIO_Registers結構指定的所有32位寄存器。

(volatile GPIO_Registers*)是一個簡單的類型轉換,因爲GPIO_BASE_ADDR和其他定義都是簡單的「數字」,您必須指定這些「數字」的類型。

+0

@downvoter ....? – LPs

0

(volatile GPIO_Registers*)(GPIO_BASE_ADDR + (PORT_A << 10))行告訴該地址是一個結構指針揮發性。此地址處的值可能隨時由硬件改變。

static volatile GPIO_Registers* const gpio[]行告訴gpio是可變結構指針揮發性靜態恆定。這個指針處的值是固定不變的,並且是文件本身的本地文件,項目中的其他文件沒有看到,所以它是static。與硬件即GPIO變量的交易,該值可能會改變在旅途中,所以它是constantvolatile

+0

「價值可能在旅途中改變,所以它是不變的[...]」? –

+0

@KolyolyHorvath - 指針的值,即GPIO寄存器的地址,不會改變。指針的目標,即該寄存器中的位可以。但是volatile並不意味着程序可以改變某些東西,這意味着編譯器必須真正執行訪問,因爲別的東西可能有,或者訪問的行爲可能有副作用 - 所以雖然不是這種情況,但你可以聲明const和volatile兩者。 –

+0

@ChrisStratton:我知道。我只是指出這句話沒有道理。 –

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

該行中的代碼鑄地址到volatile Structure pointer並在此該地址的值可以由硬件來改變。