2016-07-28 9 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変数へのポインタの静的な配列であるので、GPIOすなわち、ハードウェアと変数取引として、値は、外出先で変更されることがあります。

アレイの各要素は、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です。それはconstantvolatile

+0

"値は外出先で変わる可能性があるので、定数で[...]" ?? –

+0

@ KarolyHorvath - ポインタの値、つまりGPIOレジスタのアドレスは変更されません。ポインタのターゲット、すなわちそのレジスタ内のビットは、しかし、volatileは、プログラムが何かを変えることができるという意味ではなく、何か他のものがあるかもしれないので、コンパイラが実際にアクセスを実行しなければならない、あるいはアクセスする行為に副作用があるかもしれないことを意味します。 constとvolatileの両方を宣言します。 –

+0

@ChrisStratton:私はそれを認識しています。私は文が意味をなさないと指摘しただけです。 –

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

コードのこの行は、ハードウェアによって変更することができるvolatile Structure pointerこれで、このアドレスの値へのアドレスをキャスト。

関連する問題