Цитата(AVI-crak @ Apr 12 2016, 20:14)

Интересно, каким способом???
Как и любое выделение памяти.
Цитата
Я например точно знаю что GCC не умеет считать размер стека прерываний в режиме перепроцессора. Уже потом в отладке, фоновым процессом самого отладчика контролируется нижняя граница, и только в одном режиме ядра - для ос это уже недоступно. Копал долго и упорно, но возможно что-то упустил.
Подумате головой и выделите именно стеку фиксированный размер памяти. Отдавать стеку ВСЕ свободное пространство, причем НИКАК его размер не контролировать в надежде, что хватит, это безумие.
Цитата
Для себя эту проблему решил простым способом: heap условно растёт в верх, на встречу стеку.
Навстречу чему, это уже зависит только от Вас, поскольку где Вы расположите стеки(и) там они они и будут.
У меня системные стеки внизу.
Цитата
Условно, потому-что свой heap, для gcc он нулевой, используется только точка старта.
Нулевой это перебор. Можно указать в для статической линковки какой-то минимальный размер для старта системы. Потом уже при запуске узанать верхнюю границу памяти и сказать мереждеру, что от начала статически слинковоного блока и до конца свободной памяти все его.
Пример распределения памяти для ARM7
CODE
define symbol Code_start = 0x00000000;
// Memory Regions -----------------------------------------------------------
// 256K ROM memory
define symbol ROM_start = 0x00000000;
define symbol ROM_end = 0x00007FFF;
// 16K RAM memory
define symbol RAM_start = 0x40000000;
define symbol RAM_end = 0x40001FFF;
// Memory Block Sizes
define symbol SIZE_CSTACK = 0x20; // Dummy System/User Stack Size (Not Used!)
define symbol SIZE_SVCSTACK = 0x180; // Supervisor Mode (Main Work Mode)
define symbol SIZE_IRQSTACK = 0x200;
define symbol SIZE_FIQSTACK = 0x40; //
define symbol SIZE_XXXSTACK = 0x20; // 32bytes Shared Stack for Abort/Undefined Instruction and IAP Buffer
define symbol SIZE_HEAP_RTOS = 0x400; // 1Kb - Dummy _minimal_ space for Memory Manager
define memory mem with size = 4G;
define region ROM = mem:[from ROM_start to ROM_end];
define region RAM = mem:[from RAM_start to RAM_end - SIZE_XXXSTACK];
define region RAM_endblock = mem:[from RAM_end - SIZE_XXXSTACK + 1 to RAM_end];
define block CSTACK with alignment=8, size = SIZE_CSTACK { };
define block SVC_STACK with alignment=8, size = SIZE_SVCSTACK { };
define block IRQ_STACK with alignment=8, size = SIZE_IRQSTACK { };
define block FIQ_STACK with alignment=8, size = SIZE_FIQSTACK { };
define block HEAP_RTOS with alignment=8, size = SIZE_HEAP_RTOS { };
define block XXX_BLOCK with alignment=8, size = SIZE_XXXSTACK { };
define block CHECKSUM { readonly section .checksum };
initialize by copy { readwrite };
do not initialize { section .noinit };
place in ROM { readonly section .intvec };
place in ROM { readonly };
place in ROM { block CHECKSUM };
place in RAM { readwrite,
block CSTACK, block SVC_STACK, block IRQ_STACK, block FIQ_STACK };
place in RAM { block HEAP_RTOS };
place in RAM_endblock {
block XXX_BLOCK };