Всем привет! Работаю в основном в 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, но все равно до меня не дошло как оно работает и для чего оно нужно, и как его использовать.
Scatter файл. Keil, STM32
- Реклама
Re: Scatter файл. Keil, STM32
Кейлом не пользуюсь, но если просто включить логику и исходя из названий то:
"load region" - регион загрузки (регион адресов памяти откуда грузится код);
"executable region" - регион выполнения (регион адресов памяти в которых код выполняется).
Для МК со встроенным FLASH (как у вас) очевидно - эти регионы совпадают. Для МК, которые не имеют встроенной флешь, и в которых загрузчик грузит код из внешней памяти перед выполнением, они будут разные.
PS: Впрочем - иногда бывает, что даже у МК со встроенной FLASH эти регионы будут разными. Одна и та же память может отображаться на разные адреса адресного пространства.
"load region" - регион загрузки (регион адресов памяти откуда грузится код);
"executable region" - регион выполнения (регион адресов памяти в которых код выполняется).
Для МК со встроенным FLASH (как у вас) очевидно - эти регионы совпадают. Для МК, которые не имеют встроенной флешь, и в которых загрузчик грузит код из внешней памяти перед выполнением, они будут разные.
PS: Впрочем - иногда бывает, что даже у МК со встроенной FLASH эти регионы будут разными. Одна и та же память может отображаться на разные адреса адресного пространства.
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).
Значит я что-то не так понимаю. Помогите пожалуйста разобраться с этим. Правильно ли я это понял?
По поводу «региона выполнения» я не уверен правильно ли я его понимаю, физически.
Регион выполнения - это откуда будет код выполняться правильно?
То есть если 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).
Значит я что-то не так понимаю. Помогите пожалуйста разобраться с этим. Правильно ли я это понял?
Re: Scatter файл. Keil, STM32
[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-файле.
[uquote="kollbert",url="/forum/viewtopic.php?p=4742933#p4742933"]А секция «.ANY (+XO)» по адресу 0x08004000. По логике если мы прочитаем flash(с помощью STM32 ST-LINK Utility) то мы должны увидеть какие-то данные по адресу 0x08004000. Но там пусто(0xFFFFFFFF лежат)[/uquote]Значит компоновщик не разместил в том регионе никакие данные/код. Какие секции в какой регион компонуются компоновщиком - надо смотреть в .map-файле.
Re: Scatter файл. Keil, STM32
[/uquote]Это регион адресов, по которым этот код/данные будет виден вашей программе.
Не совсем понял этот момент
Добавлено after 3 minutes 27 seconds:
Какой можно пример привести?
Думаю так до меня дойдет возможно)
Не совсем понял этот момент
Добавлено after 3 minutes 27 seconds:
Какой можно пример привести?
Думаю так до меня дойдет возможно)
- Реклама
Re: Scatter файл. Keil, STM32
[uquote="kollbert",url="/forum/viewtopic.php?p=4742950#p4742950"]Какой можно пример привести?
Думаю так до меня дойдет возможно)[/uquote]Вызов функции:В точке входа функции func() в регистре PC будет находиться именно исполнительный адрес функции func() и никакой другой. А в регистре LR - опять же исполнительный адрес команды, следующей за CALL func.
Думаю так до меня дойдет возможно)[/uquote]Вызов функции:
Код: Выделить всё
CALL funcRe: Scatter файл. Keil, STM32
jcxz благодарю за ответы.
Я разобрался! Поясню, вдруг кому понадобится.
Проще говоря регион загрузки, это область где прошивка(а конкретно указанные данные, находящиеся в теле LR_IROM1) буду располагать физически, по указанном нами адресу.
Область выполнения - где, указанные нами данные/код, будет выполняться. Например если мы выбрали область выполнения из RAM, то после сброса, данные, указанные в теле области выполнения(RW_IRAM1) будут скопированы в RAM, и при их использовании они будут считываться/записывать из RAM, а не из flash(хотя во flash они тоже хранятся).
Я разобрался! Поясню, вдруг кому понадобится.
Проще говоря регион загрузки, это область где прошивка(а конкретно указанные данные, находящиеся в теле LR_IROM1) буду располагать физически, по указанном нами адресу.
Область выполнения - где, указанные нами данные/код, будет выполняться. Например если мы выбрали область выполнения из RAM, то после сброса, данные, указанные в теле области выполнения(RW_IRAM1) будут скопированы в RAM, и при их использовании они будут считываться/записывать из RAM, а не из flash(хотя во flash они тоже хранятся).


