Jump to content

    
Sign in to follow this  
Rivas

Указатель стека и scatter file

Recommended Posts

2 часа назад, uriy сказал:

Вот из вашего мап файла


    .bss                                     0x24000000   Section       96  libspace.o(.bss)
    HEAP                                     0x24000060   Section      512  startup_stm32h743xx.o(HEAP)
    Heap_Mem                                 0x24000060   Data         512  startup_stm32h743xx.o(HEAP)
    STACK                                    0x2407fc00   Section     1024  startup_stm32h743xx.o(STACK)
    __initial_sp                             0x24080000   Data           0  startup_stm32h743xx.o(STACK)

 

То есть:

-.bss секция начинается с адреса  0x24000000 и заканчивается по адресу 0x24000060, что означает 96 - это максимальный объем, который может занимать .bss секция?

-Heap и начинается с адреса 0x24000060, а где заканчивается не известно, что означает 512?

- Heap_mem - это из файла startup, зарезервированная область под кучу и она равна 0x00000200, значит что куча заканчивается по адресу 0x24000260? Что означает 512?

- STACK - это адрес конца стека(если к этому адресу, прибавить размер области под стек, то получится 0x24080000)?

- _initial_sp - это адрес указателя стека?

 

34 минуты назад, VladislavS сказал:

Вообще, организация памяти у этого чипа несколько сложнее. Цитата с сайта производителя

По хорошему, все эти типы памяти надо описать и использовать по назначению.

Да, я в курсе, пока ими не пользуюсь, тут бы со стеком и кучей разобраться, а потом затактировать МК...)))

Share this post


Link to post
Share on other sites
4 минуты назад, VladislavS сказал:

Ну раз не пользуетесь, то размещение, которое keil делает по умолчанию, использовать и не выпендриваться.

Где, что размещать, я разберусь сам. Здесь, я затем что бы разобраться, как размещать.

Share this post


Link to post
Share on other sites
6 hours ago, Rivas said:

Heap и начинается с адреса 0x24000060, а где заканчивается не известно, что означает 512?

 

23 minutes ago, Rivas said:

Где, что размещать, я разберусь сам

Процесс будет не быстрым.

Share this post


Link to post
Share on other sites
Quote

Что означает 512?


- STACK - это адрес конца стека(если к этому адресу, прибавить размер области под стек, то получится 0x24080000)?
- _initial_sp - это адрес указателя стека?

STACK - символическое имя

ВуалЯ: таблица с "шапкой"

    Symbol Name                              Value     Ov Type        Size  Object(Section)
    .bss                                     0x24000000   Section       96  libspace.o(.bss)
    HEAP                                     0x24000060   Section      512  startup_stm32h743xx.o(HEAP)
    Heap_Mem                                 0x24000060   Data         512  startup_stm32h743xx.o(HEAP)
    STACK                                    0x2407fc00   Section     1024  startup_stm32h743xx.o(STACK)
    __initial_sp                             0x24080000   Data           0  startup_stm32h743xx.o(STACK)

PS: и теперь по-китайски? Ж8-)

Edited by Obam

Share this post


Link to post
Share on other sites
7 minutes ago, Obam said:

ВуалЯ

Открываем файл и видим !

Stack_Size      EQU     0x00000400
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem   SPACE   Stack_Size
__initial_sp

 

Heap_Size       EQU     0x00000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit
 

Знакомые все буквы !

Share this post


Link to post
Share on other sites
20 часов назад, Obam сказал:

STACK - символическое имя

ВуалЯ: таблица с "шапкой"


    Symbol Name                              Value     Ov Type        Size  Object(Section)
    .bss                                     0x24000000   Section       96  libspace.o(.bss)
    HEAP                                     0x24000060   Section      512  startup_stm32h743xx.o(HEAP)
    Heap_Mem                                 0x24000060   Data         512  startup_stm32h743xx.o(HEAP)
    STACK                                    0x2407fc00   Section     1024  startup_stm32h743xx.o(STACK)
    __initial_sp                             0x24080000   Data           0  startup_stm32h743xx.o(STACK)

PS: и теперь по-китайски? Ж8-)

 

Блин, парни, Вы пишете обо всём..., кроме ответов на вопрос. Разжуйте таблицу, пожалуйста. 

Edited by Rivas

Share this post


Link to post
Share on other sites

Вопросы (ваши?):

То есть:


-.bss секция начинается с адреса 0x24000000 и заканчивается по адресу 0x24000060, что означает 96 - это максимальный объем, который может занимать .bss секция?
-Heap и начинается с адреса 0x24000060, а где заканчивается не известно, что означает 512?
- Heap_mem - это из файла startup, зарезервированная область под кучу и она равна 0x00000200, значит что куча заканчивается по адресу 0x24000260? Что означает 512?
- STACK - это адрес конца стека(если к этому адресу, прибавить размер области под стек, то получится 0x24080000)?
- _initial_sp - это адрес указателя стека?


- да, в секции .bss с адреса 0x24000000 был положен объектный модуль libspace.o; 96 не означает, а обозначает его размер (столбец озаглавлен "Size" - "размер" по-нашему) и не "максимальный, который может занимать .bss секция", а тот, что получился (сколько переменных нужно проинициировать столько и потребуется);
- HEAP ("куча") - тоже секция (столбец озаглавлен "Type" - "тип", в смысле "разновидность"); почему начинается с 0x24000060 понятно, нет? Если области в памяти идут "без дырок" между ними, а предыдущая размером 96 байт начиналась с 0x24000000, то следующая с какого адреса начнётся? 96 это 0x60. 512 обозначает размер секции HEAP (столбец озаглавлен "Size" - "размер" по-нашему); секция закончится известно где: 0x24000060+0x(сам в hex преобразуешь, не барин, чай)-1;
- расмер в байтах;
- указатель стека это регистр SP (R13) в ядре, а это адрес верхушки стека.

PS: пока объяснил даже сам понял ;-)

Share this post


Link to post
Share on other sites
15 часов назад, Obam сказал:

Вопросы (ваши?):

 


- да, в секции .bss с адреса 0x24000000 был положен объектный модуль libspace.o; 96 не означает, а обозначает его размер (столбец озаглавлен "Size" - "размер" по-нашему) и не "максимальный, который может занимать .bss секция", а тот, что получился (сколько переменных нужно проинициировать столько и потребуется);
- HEAP ("куча") - тоже секция (столбец озаглавлен "Type" - "тип", в смысле "разновидность"); почему начинается с 0x24000060 понятно, нет? Если области в памяти идут "без дырок" между ними, а предыдущая размером 96 байт начиналась с 0x24000000, то следующая с какого адреса начнётся? 96 это 0x60. 512 обозначает размер секции HEAP (столбец озаглавлен "Size" - "размер" по-нашему); секция закончится известно где: 0x24000060+0x(сам в hex преобразуешь, не барин, чай)-1;
- расмер в байтах;
- указатель стека это регистр SP (R13) в ядре, а это адрес верхушки стека.

PS: пока объяснил даже сам понял ;-)

Спасибо Вам, за конструктивный ответ. Выходит, что в скаттер файле,  секцию heap, я объявил не правильно. Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size(по умолчанию, линкер скрипт, так и делает, так что этот регион можно просто убрать)?

Так же спасибо всем остальным участникам консилиума: - дающем не полные ответы(что бы клиент имел возможность подумать самостоятельно..., но в большинстве случаев лучше дать явный ответ...), специалистам по грамматике и терминологии, в общем всем тем, кто так или иначе издевался(по доброму) на протяжении 4-5 дней, если с такой скоростью давать ответы на простые вопросы, то у желающих чего-то узнать, может пропасть интерес к освоению предмета.(у меня один референс мануална 3000стр., датащит - 300стр., программ мануал ARM - 250стр. и это не исчерпывающий список литературы и все это не легко. Я не жалуюсь, просто у людей которые узнают, с нуля, эту тему и так в голове как-будто гранату взорвали...)

Так же, если вдруг, в эту тему, зайдет такой же, как и я "специалист". Оставляю для него артефакт, в виде ссылки на литературу, на русском языке, она написана под ядра М4, но большинство утверждений справедливо и для М7. Так же, там имеется общая информация про Keil.

 https://docviewer.yandex.ru/view/0/?*=GlBlPuL04flLF2CFwVgYEKja3457InVybCI6Imh0dHA6Ly9tb3RvcmNvbnRyb2wucnUvd3AtY29udGVudC91cGxvYWRzLzIwMTkvMDQvJUQwJTlGJUQxJTgwJUQwJUIwJUQwJUJBJUQxJTgyJUQwJUI4JUQxJTg3JUQwJUI1JUQxJTgxJUQwJUJBJUQwJUI4JUQwJUI5XyVEMCVCQSVEMSU4MyVEMSU4MCVEMSU4MV8lRDAlQkMlRDAlQjglRDAlQkElRDElODAlRDAlQkUlRDAlQkYlRDElODAlRDAlQkUlRDElODYlRDAlQjUlRDElODElRDElODElRDAlQkUlRDElODAucGRmIiwidGl0bGUiOiLQn9GA0LDQutGC0LjRh9C10YHQutC40Llf0LrRg9GA0YFf0LzQuNC60YDQvtC%2F0YDQvtGG0LXRgdGB0L7RgC5wZGYiLCJub2lmcmFtZSI6dHJ1ZSwidWlkIjoiMCIsInRzIjoxNTk4NDI4NzIwMjUxLCJ5dSI6IjE0ODMyMDc5MDE1OTg0MTg1NTAiLCJzZXJwUGFyYW1zIjoibGFuZz1ydSZ0bT0xNTk4NDI4NzEwJnRsZD1ydSZuYW1lPSVEMCU5RiVEMSU4MCVEMCVCMCVEMCVCQSVEMSU4MiVEMCVCOCVEMSU4NyVEMCVCNSVEMSU4MSVEMCVCQSVEMCVCOCVEMCVCOV8lRDAlQkElRDElODMlRDElODAlRDElODFfJUQwJUJDJUQwJUI4JUQwJUJBJUQxJTgwJUQwJUJFJUQwJUJGJUQxJTgwJUQwJUJFJUQxJTg2JUQwJUI1JUQxJTgxJUQxJTgxJUQwJUJFJUQxJTgwLnBkZiZ0ZXh0PW1vdG9yY29udHJvbC5ydSVFMiU4MCVCQXdwJUUyJTgwJUE2MjAxOS8wNCVFMiU4MCVBNiVEMCVCQSVEMSU4MyVEMSU4MCVEMSU4MV8lRDAlQkMlRDAlQjglRDAlQkElRDElODAlRDAlQkUlRDAlQkYlRDElODAlRDAlQkUlRDElODYlRDAlQjUlRDElODElRDElODElRDAlQkUlRDElODAucGRmJnVybD1odHRwJTNBLy9tb3RvcmNvbnRyb2wucnUvd3AtY29udGVudC91cGxvYWRzLzIwMTkvMDQvJTI1RDAlMjU5RiUyNUQxJTI1ODAlMjVEMCUyNUIwJTI1RDAlMjVCQSUyNUQxJTI1ODIlMjVEMCUyNUI4JTI1RDElMjU4NyUyNUQwJTI1QjUlMjVEMSUyNTgxJTI1RDAlMjVCQSUyNUQwJTI1QjglMjVEMCUyNUI5XyUyNUQwJTI1QkElMjVEMSUyNTgzJTI1RDElMjU4MCUyNUQxJTI1ODFfJTI1RDAlMjVCQyUyNUQwJTI1QjglMjVEMCUyNUJBJTI1RDElMjU4MCUyNUQwJTI1QkUlMjVEMCUyNUJGJTI1RDElMjU4MCUyNUQwJTI1QkUlMjVEMSUyNTg2JTI1RDAlMjVCNSUyNUQxJTI1ODElMjVEMSUyNTgxJTI1RDAlMjVCRSUyNUQxJTI1ODAucGRmJmxyPTImbWltZT1wZGYmbDEwbj1ydSZzaWduPWQ1YzA5OGU0YmZiMjI3NjVmNjQ3NzdmZTg0MmJkNTA4JmtleW5vPTAifQ%3D%3D&lang=ru

Edited by Rivas

Share this post


Link to post
Share on other sites

 

#! armclang -E --target=arm-arm-none-eabi -mcpu=cortex-m4 -xc

#define __ROM_BASE     0x08000000
#define __ROM_SIZE     (1024*256)

#define __RAM_BASE     0x20000000
#define __RAM_SIZE     (1024*40)

#define __STACK_SIZE       1024
#define __HEAP_SIZE        0

#define __STACK_TOP    (__RAM_BASE + __RAM_SIZE) /* Stack starts at end of RAM */
#define __HEAP_BASE    (AlignExpr(+0, 8))        /* Heap starts after RW_RAM section, 8 byte aligned */

#define __RW_SIZE        (__RAM_SIZE - __STACK_SIZE - __HEAP_SIZE)

LR_FLASH __ROM_BASE __ROM_SIZE       ; load region size_region
{    
  ER_IROM1 __ROM_BASE __ROM_SIZE     ; load address = execution address
  {  
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }

  RW_IRAM1 __RAM_BASE __RW_SIZE      ; RW data
  {  
   .ANY (+RW +ZI)
  }

#if __HEAP_SIZE > 0
  ARM_LIB_HEAP  __HEAP_BASE EMPTY  __HEAP_SIZE  {   ; Reserve empty region for heap
  }
#endif

  ARM_LIB_STACK __STACK_TOP EMPTY -__STACK_SIZE {}  ; Reserve empty region for stack
}

В стартапе выкидываем определение стека и кучи. Адрес стека для таблицы векторов прерываний берём так

  #define __STACK_TOP (void *)&Image$$ARM_LIB_STACK$$ZI$$Limit
  extern int Image$$ARM_LIB_STACK$$ZI$$Limit;

 

Share this post


Link to post
Share on other sites
9 часов назад, Rivas сказал:

Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size

А разве редактор связей (линкер) не умеет располагать секции последовательно, без лишней писанины "+ .bss size"?

Share this post


Link to post
Share on other sites
10 минут назад, Сергей Борщ сказал:

А разве редактор связей (линкер) не умеет располагать секции последовательно, без лишней писанины "+ .bss size"?

Вот, моя полная цитата, в конце, в скобках, как раз то о чем Вы пишите:

"Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size(по умолчанию, линкер скрипт, так и делает, так что этот регион можно просто убрать)"

 

Edited by Rivas

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.

Sign in to follow this