Rivas 0 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба 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 сказал: Вообще, организация памяти у этого чипа несколько сложнее. Цитата с сайта производителя По хорошему, все эти типы памяти надо описать и использовать по назначению. Да, я в курсе, пока ими не пользуюсь, тут бы со стеком и кучей разобраться, а потом затактировать МК...))) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба Ну раз не пользуетесь, то размещение, которое keil делает по умолчанию, использовать и не выпендриваться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rivas 0 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба 4 минуты назад, VladislavS сказал: Ну раз не пользуетесь, то размещение, которое keil делает по умолчанию, использовать и не выпендриваться. Где, что размещать, я разберусь сам. Здесь, я затем что бы разобраться, как размещать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба 6 hours ago, Rivas said: Heap и начинается с адреса 0x24000060, а где заканчивается не известно, что означает 512? 23 minutes ago, Rivas said: Где, что размещать, я разберусь сам Процесс будет не быстрым. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rivas 0 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба 2 минуты назад, x893 сказал: Процесс будет не быстрым. Обучение, быстрым не бывает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 24 августа, 2020 Опубликовано 24 августа, 2020 (изменено) · Жалоба 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-) Изменено 24 августа, 2020 пользователем Obam Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба 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 Знакомые все буквы ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 24 августа, 2020 Опубликовано 24 августа, 2020 · Жалоба Похоже, реально по-китайски... там (в 1.map) таблица уже озаглавленная, её и привёл. А вообще да, листинги лет 40 как подробные до тла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rivas 0 25 августа, 2020 Опубликовано 25 августа, 2020 (изменено) · Жалоба 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-) Блин, парни, Вы пишете обо всём..., кроме ответов на вопрос. Разжуйте таблицу, пожалуйста. Изменено 25 августа, 2020 пользователем Rivas Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 25 августа, 2020 Опубликовано 25 августа, 2020 · Жалоба Вопросы (ваши?): То есть: -.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: пока объяснил даже сам понял ;-) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rivas 0 26 августа, 2020 Опубликовано 26 августа, 2020 (изменено) · Жалоба 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 Изменено 26 августа, 2020 пользователем Rivas Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба #! 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rivas 0 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба Спасибо Вам, за интересный шаблон. arm-arm-none-eabi можно прикрутить к Keil? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 26 августа, 2020 Опубликовано 26 августа, 2020 · Жалоба 9 часов назад, Rivas сказал: Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size А разве редактор связей (линкер) не умеет располагать секции последовательно, без лишней писанины "+ .bss size"? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Rivas 0 26 августа, 2020 Опубликовано 26 августа, 2020 (изменено) · Жалоба 10 минут назад, Сергей Борщ сказал: А разве редактор связей (линкер) не умеет располагать секции последовательно, без лишней писанины "+ .bss size"? Вот, моя полная цитата, в конце, в скобках, как раз то о чем Вы пишите: "Так как: под .bss секцию выделяется памяти "сколько нужно", а секция heap начинается с адреса 0x24000060 и если под .bss секцию потребуется памяти больше, чем 96, то она перекроет секцию heap. Значит, секция heap должна начинаться с адреса 0x24000000 + .bss size(по умолчанию, линкер скрипт, так и делает, так что этот регион можно просто убрать)" Изменено 26 августа, 2020 пользователем Rivas Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться