Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: GCC linker script cortex-M3
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > scmRTOS
mdmitry
Предисловие: Предпочитаю использовать понятный для меня код.

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


Возможно, возникнут еще вопросы.
Спасибо.
AHTOXA
Цитата(mdmitry @ Apr 11 2012, 14:09) *
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. Надо будет поправить...)
mdmitry
Цитата(AHTOXA @ Apr 11 2012, 12:54) *
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 то не совпадают!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.