2016-03-31 5 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?.

Когда я запускаю свой код, я захватываю адреса этих двух буферов, Txbuffer действительно находится в области .data, однако RxBuffer находится в пределах .bss, который зарезервирован для неинициализированных переменных времени компиляции. Если я изменю {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

В частности, флаги: «Вызов: MicroBlaze gcc-компилятор» mb-gcc -Wall -O0 -g3 -c -fmessage-length = 0 -I ../../ XpsMBprjFlitesHub2_bsp_standalone_2/microblaze_0/include -mno-xl-reorder -mlittle-endian -mcpu = v8.50.c -mno-xl-soft-mul -Wl, - no-relax -function-sections -fdata-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

Причина путаницы в том, что в документации Xilinx указано, что: ".bss Этот раздел содержит неинициализированные данные. Этот раздел имеет флаг w (чтение-запись) и должен быть отображен в ОЗУ." Однако, как вы упомянули, секция .bss инициализируется нулем, поэтому инициализируется. –

Смежные вопросы