Например TDA7294

Форум РадиоКот :: Просмотр темы - Scatter файл. Keil, STM32
Форум РадиоКот
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/