Перейти к содержанию
    

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

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 сказал:

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

6 hours ago, Rivas said:

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

 

23 minutes ago, Rivas said:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

2 минуты назад, x893 сказал:

 

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

Обучение, быстрым не бывает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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-)

Изменено пользователем Obam

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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
 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Похоже, реально по-китайски... там (в 1.map) таблица уже озаглавленная, её и привёл.

А вообще да, листинги лет 40 как подробные до тла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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-)

 

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

Изменено пользователем Rivas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

То есть:


-.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: пока объяснил даже сам понял ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем Rivas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

#! 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;

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

9 часов назад, Rivas сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 минут назад, Сергей Борщ сказал:

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

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

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

 

Изменено пользователем Rivas

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...