Цитата(dxp @ Nov 15 2006, 16:41)

Цитата(makc @ Nov 15 2006, 19:30)

...сделать volatile, то по идее компилятор должен будет ее сохранить.
Даже не по идее, а просто обязан выделить память в стеке. И выделяет. Никаких трюков.
Простой эксперимент:
arm-elf-gcc --version :
Код
arm-elf-gcc (GCC) 4.1.0
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Два исходника:
Код
int f(int a, int b)
{
static volatile int c;
return a+b;
}
и
Код
int f(int a, int b)
{
int c;
return a+b;
}
arm-elf-objdump -x test1.o :
Цитата
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000024 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000004 00000000 00000000 00000058 2**2
ALLOC
3 .comment 00000012 00000000 00000000 00000058 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l df *ABS* 00000000 test.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l .bss 00000000 c.1237
00000000 l d .comment 00000000 .comment
00000000 g F .text 00000024 f
arm-elf-objdump -x test2.o :
Цитата
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000024 00000000 00000000 00000034 2**2
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .data 00000000 00000000 00000000 00000058 2**0
CONTENTS, ALLOC, LOAD, DATA
2 .bss 00000000 00000000 00000000 00000058 2**0
ALLOC
3 .comment 00000012 00000000 00000000 00000058 2**0
CONTENTS, READONLY
SYMBOL TABLE:
00000000 l df *ABS* 00000000 test.c
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 00000000 .bss
00000000 l d .comment 00000000 .comment
00000000 g F .text 00000024 f
Вывод - static volatile int - выделяется не в стеке, а в .bss и сохраняется компилятором даже если не используется в функции. Что и требовалось. Хотя и просто static int тоже остается.