mdmitry 0 April 11, 2012 Posted April 11, 2012 · Report post Предисловие: Предпочитаю использовать понятный для меня код. Внимательно смотрел скрипт линкера для порта Cortex-M3 и сравнивал его с generic-m.ld от CodeSourcery arm-2011.09. Возникли вопросы: 1. Где инициализируется стек? Вижу выравнивание /* higher address of the user mode stack */ PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); , но не нашел загрузку регистров в файлах инициализации. 2. Что это за стек и где используется? /* * This is the user stack section * This is just to check that there is enough RAM left for the User mode stack * It should generate an error if it's full. */ ._usrstack : { . = ALIGN(4); _susrstack = .; . = . + _Minimum_Stack_Size; . = ALIGN(4); _eusrstack = .; } >RAM Ссылку на символ usrstack не нашел. 3. Правильно ли понимаю, что куча располагается после секции bss с выравниванием на двойное слово? PROVIDE( _heap = _ebss ); PROVIDE ( _eheap = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); Возможно, возникнут еще вопросы. Спасибо. Quote Share this post Link to post Share on other sites More sharing options...
AHTOXA 25 April 11, 2012 Posted April 11, 2012 · Report post 1. Где инициализируется стек? Вижу выравнивание /* higher address of the user mode stack */ PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); , но не нашел загрузку регистров в файлах инициализации. Вот же он: __attribute__ ((section(".isr_vector"))) intfunc g_pfnVectors[] = { /* Core interrupt vectors */ (intfunc)((unsigned long)&_estack), Reset_Handler, Cortex-M3 грузит указатель стека автоматом из первого адреса таблицы векторов. 2. Что это за стек и где используется? Это так называемый Main stack. Используется в прерываниях. Ссылку на символ usrstack не нашел. Там же написано: "This is just to check that there is enough RAM left for the User mode stack". Это просто для проверки, что осталось место под стек. То есть, если секция не влезет в память, линкер заругается, и мы будем знать, что у нас нет _Minimum_Stack_Size памяти для Main stack. 3. Правильно ли понимаю, что куча располагается после секции bss с выравнивынием на двойное слово? Нет. Куча распологается просто после bss. Конец bss выровнен на слово. А _eheap - это конец кучи. (И он определён неверно, надо отнять ещё _Minimum_Stack_Size. Надо будет поправить...) Quote Share this post Link to post Share on other sites More sharing options...
mdmitry 0 April 11, 2012 Posted April 11, 2012 · Report post Cortex-M3 грузит указатель стека автоматом из первого адреса таблицы векторов. Спасибо, AHTOXA. Я проглядел. Это так называемый Main stack. Используется в прерываниях. Стало понятно. Нет. Куча распологается просто после bss. Конец bss выровнен на слово. А _eheap - это конец кучи. (И он определён неверно, надо отнять ещё _Minimum_Stack_Size. Надо будет поправить...) Начало кучи на конце bss? PROVIDE( _heap = _ebss ); Конец кучи здесь: PROVIDE ( _eheap = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); но это совпадает с /* higher address of the user mode stack */ PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) ); Куча и стек совпадают? Или нет если отнять _Minimum_Stack_Size то не совпадают! Quote Share this post Link to post Share on other sites More sharing options...