Scatter файл. Keil, STM32

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
kollbert
Родился
Сообщения: 4
Зарегистрирован: Вс авг 31, 2025 17:10:30

Scatter файл. Keil, STM32

Сообщение kollbert »

Всем привет! Работаю в основном в 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
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Scatter файл. Keil, STM32

Сообщение jcxz »

Кейлом не пользуюсь, но если просто включить логику и исходя из названий то:
"load region" - регион загрузки (регион адресов памяти откуда грузится код);
"executable region" - регион выполнения (регион адресов памяти в которых код выполняется).
Для МК со встроенным FLASH (как у вас) очевидно - эти регионы совпадают. Для МК, которые не имеют встроенной флешь, и в которых загрузчик грузит код из внешней памяти перед выполнением, они будут разные.

PS: Впрочем - иногда бывает, что даже у МК со встроенной FLASH эти регионы будут разными. Одна и та же память может отображаться на разные адреса адресного пространства.
Реклама
kollbert
Родился
Сообщения: 4
Зарегистрирован: Вс авг 31, 2025 17:10:30

Re: Scatter файл. Keil, STM32

Сообщение kollbert »

Я Работаю конкретно с 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
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Scatter файл. Keil, STM32

Сообщение jcxz »

[uquote="kollbert",url="/forum/viewtopic.php?p=4742933#p4742933"]Регион выполнения - это откуда будет код выполняться правильно?[/uquote]Это регион адресов, по которым этот код/данные будет виден вашей программе.

[uquote="kollbert",url="/forum/viewtopic.php?p=4742933#p4742933"]А секция «.ANY (+XO)» по адресу 0x08004000. По логике если мы прочитаем flash(с помощью STM32 ST-LINK Utility) то мы должны увидеть какие-то данные по адресу 0x08004000. Но там пусто(0xFFFFFFFF лежат)[/uquote]Значит компоновщик не разместил в том регионе никакие данные/код. Какие секции в какой регион компонуются компоновщиком - надо смотреть в .map-файле.
Реклама
Эиком - электронные компоненты и радиодетали
kollbert
Родился
Сообщения: 4
Зарегистрирован: Вс авг 31, 2025 17:10:30

Re: Scatter файл. Keil, STM32

Сообщение kollbert »

[/uquote]Это регион адресов, по которым этот код/данные будет виден вашей программе.

Не совсем понял этот момент

Добавлено after 3 minutes 27 seconds:
Какой можно пример привести?
Думаю так до меня дойдет возможно)
Реклама
jcxz
Мудрый кот
Сообщения: 1717
Зарегистрирован: Вт авг 15, 2017 10:51:13

Re: Scatter файл. Keil, STM32

Сообщение jcxz »

[uquote="kollbert",url="/forum/viewtopic.php?p=4742950#p4742950"]Какой можно пример привести?
Думаю так до меня дойдет возможно)[/uquote]Вызов функции:

Код: Выделить всё

CALL func
В точке входа функции func() в регистре PC будет находиться именно исполнительный адрес функции func() и никакой другой. А в регистре LR - опять же исполнительный адрес команды, следующей за CALL func.
Реклама
kollbert
Родился
Сообщения: 4
Зарегистрирован: Вс авг 31, 2025 17:10:30

Re: Scatter файл. Keil, STM32

Сообщение kollbert »

jcxz благодарю за ответы.

Я разобрался! Поясню, вдруг кому понадобится.
Проще говоря регион загрузки, это область где прошивка(а конкретно указанные данные, находящиеся в теле LR_IROM1) буду располагать физически, по указанном нами адресу.
Область выполнения - где, указанные нами данные/код, будет выполняться. Например если мы выбрали область выполнения из RAM, то после сброса, данные, указанные в теле области выполнения(RW_IRAM1) будут скопированы в RAM, и при их использовании они будут считываться/записывать из RAM, а не из flash(хотя во flash они тоже хранятся).
Ответить

Вернуться в «ARM»