Jump to content
    

GCC linker script cortex-M3

Предисловие: Предпочитаю использовать понятный для меня код.

 

Внимательно смотрел скрипт линкера для порта 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) );

 

Возможно, возникнут еще вопросы.

Спасибо.

Share this post


Link to post
Share on other sites

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. Надо будет поправить...)

 

Share this post


Link to post
Share on other sites

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 то не совпадают!

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...