Rivas 0 Posted August 24, 2020 · Report post 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 сказал: Вообще, организация памяти у этого чипа несколько сложнее. Цитата с сайта производителя По хорошему, все эти типы памяти надо описать и использовать по назначению. Да, я в курсе, пока ими не пользуюсь, тут бы со стеком и кучей разобраться, а потом затактировать МК...))) Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted August 24, 2020 · Report post Ну раз не пользуетесь, то размещение, которое keil делает по умолчанию, использовать и не выпендриваться. Quote Ответить с цитированием Share this post Link to post Share on other sites
Rivas 0 Posted August 24, 2020 · Report post 4 минуты назад, VladislavS сказал: Ну раз не пользуетесь, то размещение, которое keil делает по умолчанию, использовать и не выпендриваться. Где, что размещать, я разберусь сам. Здесь, я затем что бы разобраться, как размещать. Quote Ответить с цитированием Share this post Link to post Share on other sites
x893 0 Posted August 24, 2020 · Report post 6 hours ago, Rivas said: Heap и начинается с адреса 0x24000060, а где заканчивается не известно, что означает 512? 23 minutes ago, Rivas said: Где, что размещать, я разберусь сам Процесс будет не быстрым. Quote Ответить с цитированием Share this post Link to post Share on other sites
Rivas 0 Posted August 24, 2020 · Report post 2 минуты назад, x893 сказал: Процесс будет не быстрым. Обучение, быстрым не бывает. Quote Ответить с цитированием Share this post Link to post Share on other sites
Obam 0 Posted August 24, 2020 (edited) · Report post 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 August 24, 2020 by Obam Quote Ответить с цитированием Share this post Link to post Share on other sites
x893 0 Posted August 24, 2020 · Report post 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_baseHeap_Mem SPACE Heap_Size __heap_limit Знакомые все буквы ! Quote Ответить с цитированием Share this post Link to post Share on other sites
Obam 0 Posted August 24, 2020 · Report post Похоже, реально по-китайски... там (в 1.map) таблица уже озаглавленная, её и привёл. А вообще да, листинги лет 40 как подробные до тла. Quote Ответить с цитированием Share this post Link to post Share on other sites
Rivas 0 Posted August 25, 2020 (edited) · Report post 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 August 25, 2020 by Rivas Quote Ответить с цитированием Share this post Link to post Share on other sites
Obam 0 Posted August 25, 2020 · Report post Вопросы (ваши?): То есть: -.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: пока объяснил даже сам понял ;-) Quote Ответить с цитированием Share this post Link to post Share on other sites
Rivas 0 Posted August 26, 2020 (edited) · Report post 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 August 26, 2020 by Rivas Quote Ответить с цитированием Share this post Link to post Share on other sites
VladislavS 0 Posted August 26, 2020 · Report post #! 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; Quote Ответить с цитированием Share this post Link to post Share on other sites
Rivas 0 Posted August 26, 2020 · Report post Спасибо Вам, за интересный шаблон. arm-arm-none-eabi можно прикрутить к Keil? Quote Ответить с цитированием Share this post Link to post Share on other sites
Сергей Борщ 0 Posted August 26, 2020 · Report post 9 часов назад, Rivas сказал: Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size А разве редактор связей (линкер) не умеет располагать секции последовательно, без лишней писанины "+ .bss size"? Quote Ответить с цитированием Share this post Link to post Share on other sites
Rivas 0 Posted August 26, 2020 (edited) · Report post 10 минут назад, Сергей Борщ сказал: А разве редактор связей (линкер) не умеет располагать секции последовательно, без лишней писанины "+ .bss size"? Вот, моя полная цитата, в конце, в скобках, как раз то о чем Вы пишите: "Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size(по умолчанию, линкер скрипт, так и делает, так что этот регион можно просто убрать)" Edited August 26, 2020 by Rivas Quote Ответить с цитированием Share this post Link to post Share on other sites