Форум РадиоКот https://radiokot.ru/forum/ |
|
Scatter файл. Keil, STM32 https://radiokot.ru/forum/viewtopic.php?f=59&t=198975 |
Страница 1 из 1 |
Автор: | kollbert [ Вс авг 31, 2025 17:28:10 ] |
Заголовок сообщения: | Scatter файл. Keil, STM32 |
Всем привет! Работаю в основном в keil(предпочтительно с STM32). Хочу разобраться с содержимом scatter файла. Вот пример стандартного кода в scatter файле: LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00080000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } } что делает LR_IROM1(регион загрузки) и для чего он нужен, я уже понял. Он кладет физически данные и код по указанном адресу(если создать два региона LR_IROM1 и LR_IROM2 с разными адресами и прочитать flash через STM32 ST-LINK Utility то это можно будет увидеть и убедиться в этом). Главный вопрос – для чего нужен ER_IROM1(регион выполнения) и какую функцию он выполняет? Как с ним работать? Обьясните пожалуйста кто знает, или как можно самому проверить(например через STM32 ST-LINK Utility как и с LR_IROM1)? На официальном сайте ARM читал, по интернету гулял, по разному игрался работая в STM32 ST-LINK Utility, но все равно до меня не дошло как оно работает и для чего оно нужно, и как его использовать. |
Автор: | jcxz [ Пн сен 01, 2025 11:08:43 ] |
Заголовок сообщения: | Re: Scatter файл. Keil, STM32 |
Кейлом не пользуюсь, но если просто включить логику и исходя из названий то: "load region" - регион загрузки (регион адресов памяти откуда грузится код); "executable region" - регион выполнения (регион адресов памяти в которых код выполняется). Для МК со встроенным FLASH (как у вас) очевидно - эти регионы совпадают. Для МК, которые не имеют встроенной флешь, и в которых загрузчик грузит код из внешней памяти перед выполнением, они будут разные. PS: Впрочем - иногда бывает, что даже у МК со встроенной FLASH эти регионы будут разными. Одна и та же память может отображаться на разные адреса адресного пространства. |
Автор: | kollbert [ Пн сен 01, 2025 12:56:12 ] |
Заголовок сообщения: | Re: Scatter файл. Keil, STM32 |
Я Работаю конкретно с STM32F407VET. По поводу «региона выполнения» я не уверен правильно ли я его понимаю, физически. Регион выполнения - это откуда будет код выполняться правильно? То есть если ER_IROM2 0x08004000 0x00003FFF { .ANY (+XO) } то ядро будет выполнять «.ANY (+XO)» с адреса 0x08004000? Значит эти данные должны быть расположены по адресу 0x08004000? Допустим вот такой пример scatter файла: LR_IROM1 0x08000000 0x00080000 { ; load region size_region ER_IROM1 0x08000000 0x00003FFF { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ER_IROM2 0x08004000 0x00003FFF { .ANY (+XO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } } Сама вся моя прошивка занимает 1200 байт. Исходя из моего понимания, в данном примере вся прошивка должна расположится по адресу 0x08000000 размером 0x00080000. Конкретно секции « *.o (RESET, +First); *(InRoot$$Sections); .ANY (+RO)» будут располагаться по адресу 0x08000000. А секция «.ANY (+XO)» по адресу 0x08004000. По логике если мы прочитаем flash(с помощью STM32 ST-LINK Utility) то мы должны увидеть какие-то данные по адресу 0x08004000. Но там пусто(0xFFFFFFFF лежат), в реальности «.ANY (+XO)» расположились сразу после секций « *.o (RESET, +First); *(InRoot$$Sections); .ANY (+RO)» . То есть вся прошивка(все секции) занимает область по адресу 0x08000000 последовательно, а далее вся память пустая(0xFFFFFFFF). Значит я что-то не так понимаю. Помогите пожалуйста разобраться с этим. Правильно ли я это понял? |
Автор: | jcxz [ Пн сен 01, 2025 13:27:36 ] |
Заголовок сообщения: | Re: Scatter файл. Keil, STM32 |
Регион выполнения - это откуда будет код выполняться правильно? Это регион адресов, по которым этот код/данные будет виден вашей программе.А секция «.ANY (+XO)» по адресу 0x08004000. По логике если мы прочитаем flash(с помощью STM32 ST-LINK Utility) то мы должны увидеть какие-то данные по адресу 0x08004000. Но там пусто(0xFFFFFFFF лежат) Значит компоновщик не разместил в том регионе никакие данные/код. Какие секции в какой регион компонуются компоновщиком - надо смотреть в .map-файле.
|
Автор: | kollbert [ Пн сен 01, 2025 14:35:20 ] |
Заголовок сообщения: | Re: Scatter файл. Keil, STM32 |
[/uquote]Это регион адресов, по которым этот код/данные будет виден вашей программе. Не совсем понял этот момент Добавлено after 3 minutes 27 seconds: Какой можно пример привести? Думаю так до меня дойдет возможно) |
Автор: | jcxz [ Пн сен 01, 2025 14:52:38 ] |
Заголовок сообщения: | Re: Scatter файл. Keil, STM32 |
Какой можно пример привести? Вызов функции:Думаю так до меня дойдет возможно) Код: CALL func В точке входа функции func() в регистре PC будет находиться именно исполнительный адрес функции func() и никакой другой. А в регистре LR - опять же исполнительный адрес команды, следующей за CALL func.
|
Автор: | kollbert [ Ср сен 03, 2025 15:41:57 ] |
Заголовок сообщения: | Re: Scatter файл. Keil, STM32 |
jcxz благодарю за ответы. Я разобрался! Поясню, вдруг кому понадобится. Проще говоря регион загрузки, это область где прошивка(а конкретно указанные данные, находящиеся в теле LR_IROM1) буду располагать физически, по указанном нами адресу. Область выполнения - где, указанные нами данные/код, будет выполняться. Например если мы выбрали область выполнения из RAM, то после сброса, данные, указанные в теле области выполнения(RW_IRAM1) будут скопированы в RAM, и при их использовании они будут считываться/записывать из RAM, а не из flash(хотя во flash они тоже хранятся). |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |