Цитата(zltigo @ Jul 5 2008, 11:36)

Цитата
..возникла проблема: static переменным не присваивается ноль при инициализации.
Не верю. Совсем не верю.
Такая проблема есть. Сегодня наткнулся. Исследования показали следующее:
Допустим, есть массив:
static int BigArray[QuiteLargeValue] = 0;
Можно "=0" и убрать, разницы никакой.
В конфиге ICF имеем строку:
place in RAM_region { readwrite, block CSTACK, block HEAP };
Однозначно видно, что линкер пытается разложить блоки в регионе по убыванию размера. Так вот если массив оказывается большего размера, чем CSTACK или HEAP, то видим такую картину:
Код
"P2", part 1 of 5: 0x3840
.bss zero 0x1000001c 0x3840 Array.r79 [1]
- 0x1000385c 0x3840
"P2", part 2 of 5: 0x2480
HEAP 0x10003860 0x2000 <Block>
HEAP uninit 0x10003860 0x2000 <Block tail>
CSTACK 0x10005860 0x300 <Block>
CSTACK uninit 0x10005860 0x300 <Block tail>
.iar.dynexit 0x10005b60 0x180 <Block>
.iar.dynexit uninit 0x10005b60 0xc cppinit.o [15]
.iar.dynexit uninit 0x10005b6c 0x174 <Block tail>
- 0x10005ce0 0x2480
"P2", part 3 of 5: 0xc
P2 s0 0x10005ce0 0xc <Init block>
.data inited 0x10005ce0 0x4 file1.r79 [4]
.data inited 0x10005ce4 0x4 file2.r79 [9]
.data inited 0x10005ce8 0x4 cppinit.o [15]
- 0x10005cec 0xc
"P2", part 4 of 5: 0x217c
.bss zero 0x10005cec 0x1024 mem.r79 [9]
...
Наш блок Array попал в сегмент .bss, чего мы и хотели, однако, код для его инициализации не был сгенерирован линкером! Линкер начал забивать нулями область, начиная в данном случае с адреса 0x5cec. Если же уменьшить размер массива так, чтобы он оказался меньше кучи и стека, то он попадет к "остальным" членам .bss и все переменные проинициализируюутся.
Конечно, уменьшать массив это не выход, поэтому есть другой вариант обхода проблемы в конфиге линкера:
Код
place in RAM_region { readwrite };
place in RAM_region { block CSTACK, block HEAP };
Тогда сегмент .bss не будет разорван данными с другими атрибутами и инициализация пройдет нормально.