Использую Altera MAX10. Quartus 16.1. Код программы NIOS записываю в UFM.
Увидел непонятную мне вещь: секция .bss полностью записывается в UFM, видимо, чтобы потом скопировать ее в RAM, как и секцию .rwdata. То есть, во flash записано 4 кБ нулей. Ниже кусок из objdump. 0000ab40 - это адрес в UFM.
CODE
Sections:
Idx Name Size VMA LMA File off Algn
0 .entry 00000020 00008000 00008000 00001000 2**5
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .exceptions 00000160 00008020 00008020 00001020 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
2 .text 00002808 00008180 00008180 00001180 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
3 .rodata 00000094 0000a988 0000a988 00003988 2**2
CONTENTS, ALLOC, LOAD, READONLY, DATA
4 .rwdata 00000124 00010000 0000aa1c 00004000 2**2
CONTENTS, ALLOC, LOAD, DATA, SMALL_DATA
5 .bss 000011f8 00010124 0000ab40 00004124 2**2
ALLOC, SMALL_DATA
Скрипт компоновщика сгенерирован автоматом, я его не менял, вот кусок из него. onchip_memory2_0 - это RAM.
CODE
.bss :
{
__bss_start = ABSOLUTE(.);
PROVIDE (__sbss_start = ABSOLUTE(.));
PROVIDE (___sbss_start = ABSOLUTE(.));
*(.dynsbss)
*(.sbss .sbss.* .gnu.linkonce.sb.*)
*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)
*(.scommon)
PROVIDE (__sbss_end = ABSOLUTE(.));
PROVIDE (___sbss_end = ABSOLUTE(.));
*(.dynbss)
*(.bss .bss.* .gnu.linkonce.b.*)
*(COMMON)
. = ALIGN(4);
__bss_end = ABSOLUTE(.);
} > onchip_memory2_0
Пробовал писать так: .bss (NOLOAD) : ... - никакого эффекта, ничего не меняется.