Нет, с переменной все в порядке, предложенный вариант я пробовал.
Инициализация стека происходит в startup коде, указатель на стек программы инициализируемый последним и стек должен расти "вниз".
CODE
/* Enter Supervisor Mode and set its Stack Pointer */
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
mov sp, r0
sub r0, r0, #SVC_STACK_SIZE
/* Enter System Mode and set its Stack Pointer */
msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* User Mode */
mov sp, r0
В скрипте линкера есть код, который позволяет получить конец программы в SRAM, для динамического выделения памяти в heap
CODE
.bss : /* collect all uninitialized .bss sections that go into RAM */
{
_bss_start = .; /* define a global symbol marking the start of the .bss section */
*(.bss) /* all .bss sections */
} >ram /* put all the above in RAM (it will be cleared in the startup code */
. = ALIGN(4); /* advance location counter to the next 32-bit boundary */
_bss_end = . ; /* define a global symbol marking the end of the .bss section */
. = ALIGN(4);
.eh_frame :
{
KEEP (*(.eh_frame))
} > ram
}
_end = .; /* define a global symbol marking the end of application RAM */
PROVIDE (end = .);
PROVIDE (end = .) используется в void * _sbrk_r при выделении памяти :
CODE
void * _sbrk_r(
struct _reent *_s_r,
ptrdiff_t nbytes)
{
char *base; /* errno should be set to ENOMEM on error */
if (!heap_ptr) { /* Initialize if first time through. */
heap_ptr = end;
}
base = heap_ptr; /* Point to end of heap. */
heap_ptr += nbytes; /* Increase heap. */
return base; /* Return pointer to start of new heap area. */
}
Вроде все честно : стек растет с верха памяти вниз, heap начинается с конца программы и растет вверх, т.е. память не должна портиться и все должно работать. Но при использовании sprintf прошка работает через раз, такое ощущение что каким-то образом затирается стек. В общем я каком-то тупике, осталось попробовать другой toolchain.
В общем заработало, осталось самому себе объяснить полученные результаты :
При увеличении стека
.set SVC_STACK_SIZE, 0x00001000 /* stack for "SVC" supervisor mode is 4 bytes */
Форматированный вывод заработал нормально.