Всем привет! Работаю в основном в keil(предпочтительно с STM32). Хочу разобраться с содержимом scatter файла. Вот пример стандартного кода в scatter файле:
что делает LR_IROM1(регион загрузки) и для чего он нужен, я уже понял. Он кладет физически данные и код по указанном адресу(если создать два региона LR_IROM1 и LR_IROM2 с разными адресами и прочитать flash через STM32 ST-LINK Utility то это можно будет увидеть и убедиться в этом).
Главный вопрос – для чего нужен ER_IROM1(регион выполнения) и какую функцию он выполняет? Как с ним работать? Обьясните пожалуйста кто знает, или как можно самому проверить(например через STM32 ST-LINK Utility как и с LR_IROM1)?
На официальном сайте ARM читал, по интернету гулял, по разному игрался работая в STM32 ST-LINK Utility, но все равно до меня не дошло как оно работает и для чего оно нужно, и как его использовать.
Кейлом не пользуюсь, но если просто включить логику и исходя из названий то: "load region" - регион загрузки (регион адресов памяти откуда грузится код); "executable region" - регион выполнения (регион адресов памяти в которых код выполняется). Для МК со встроенным FLASH (как у вас) очевидно - эти регионы совпадают. Для МК, которые не имеют встроенной флешь, и в которых загрузчик грузит код из внешней памяти перед выполнением, они будут разные.
PS: Впрочем - иногда бывает, что даже у МК со встроенной FLASH эти регионы будут разными. Одна и та же память может отображаться на разные адреса адресного пространства.
Я Работаю конкретно с 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) }
Сама вся моя прошивка занимает 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).
Значит я что-то не так понимаю. Помогите пожалуйста разобраться с этим. Правильно ли я это понял?
А секция «.ANY (+XO)» по адресу 0x08004000. По логике если мы прочитаем flash(с помощью STM32 ST-LINK Utility) то мы должны увидеть какие-то данные по адресу 0x08004000. Но там пусто(0xFFFFFFFF лежат)
Значит компоновщик не разместил в том регионе никакие данные/код. Какие секции в какой регион компонуются компоновщиком - надо смотреть в .map-файле.
Какой можно пример привести? Думаю так до меня дойдет возможно)
Вызов функции:
Код:
CALL func
В точке входа функции func() в регистре PC будет находиться именно исполнительный адрес функции func() и никакой другой. А в регистре LR - опять же исполнительный адрес команды, следующей за CALL func.
Я разобрался! Поясню, вдруг кому понадобится. Проще говоря регион загрузки, это область где прошивка(а конкретно указанные данные, находящиеся в теле LR_IROM1) буду располагать физически, по указанном нами адресу. Область выполнения - где, указанные нами данные/код, будет выполняться. Например если мы выбрали область выполнения из RAM, то после сброса, данные, указанные в теле области выполнения(RW_IRAM1) будут скопированы в RAM, и при их использовании они будут считываться/записывать из RAM, а не из flash(хотя во flash они тоже хранятся).
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения