2016-03-31 10 views
2

私のヘッダー内の配列を初期化するのに面白い問題があります。Cの配列の初期化

は私は:

static u32 TxBuffer_Data[MAX_PKT_LEN_WORDS] = { 10 }; 
static u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

は今、私は両方とも、理想的にゼロに、コンパイル時に割り当てられ、初期化組み込みプロセッサの.dataセクション、すなわち内になりたいです。

ここでの構文は、How to initialize all members of an array to the same value?のとおりです。

私は自分のコードを実行すると、これらの2つのバッファのアドレスを取得します.Txbufferは実際には.data領域内にありますが、RxBufferは初期化されていないコンパイル時に割り当てられた変数のために予約されています。 {0}を{10}に変更すると、RxBufferは.dataセクションに正しく挿入されます。

なぜデータをゼロに初期化できず、初期化済みとして定義されているのですか?

ありがとうございました。 Ed

+2

どのコンパイラを使用していますか?どのような最適化フラグがありますか?たぶん、配列全体をゼロに初期化し、BSSもゼロに初期化するので、配列をBSSに入れて小さな「最適化」をしましたか? –

+1

ヘッダーには入れない方がいいですが、ヘッダーに 'extern'宣言を付けてモジュール自体に入れてください。 –

答えて

2

bssセクションのデータはゼロで初期化されます。

static u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS] = { 0 }; 

又は

static u32 RxBuffer_Data[MAX_DMA_RX_FIFOMODE_WORDS]; 

が実際には同じである:として配列を宣言。どちらの場合も、配列はゼロで初期化され、コンパイラは配列をbssに配置します。

+0

ありがとうございます、コンパイラはgcc –

+0

です。特にフラグは次のとおりです: 'Invoking:MicroBlaze gccコンパイラ' mb-gcc -Wall -O0 -g3 -c -fmessage-length = 0 -I ../../ XpsMBprjFlitesHub2_bsp_standalone_2 /マイクロブレイズ_0 /インクルード-mno-xl-リオーダ - リミテッド - エンディアン-mcpu = v8.50.c -mno-xl-soft-mul -Wl、-last-funcata-sections -MMD -MP- MF "src/FLITES_HUB_MB_Main.d" -MT "src/FLITES_HUB_MB_Main.d" -o "src/FLITES_HUB_MB_Main.o" "../src/FLITES_HUB_MB_Main.c" –

+0

混乱の原因は、ザイリンクスのドキュメントに記載されていることです。 ".bssこのセクションには初期化されていないデータが含まれています。このセクションにはw(読み書き可能)フラグがあり、RAMにマップする必要があります。しかし、あなたが言及したように、.bssセクションはゼロ初期化され、したがって初期化されます。 –