Страница 1 из 1

Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Сб фев 17, 2024 20:20:09
maksimdag0
Доброго вечера, форумчане!
Подскажите, я не могу разобраться с вопросом, связанным со Scatter-файлом, а именно как разместить какой либо код(функцию или переменную, например) по определенному адресу в Keil . Не хватает знаний. Сразу скажу, ответ на вопрос искал на просторах интернета долго, пишу сюда так как недоперло до конца.
Есть 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 – это регион(область) загрузки, ER_IROM1 – это регион(область) выполнения. Я понял так, что область загрузки это область памяти куда будет загружен нами указанный код , в данном примере код будет загружен в область, которая начинается с адреса 0x08000000 размером 0x00080000.

1) Ну что же такое регион(область) выполнения(ER_IROM1 0x08000000 0x00080000 )?

Второй вопрос:
2) Если я дал правильное определение что такое "LR_IROM1", то почему в теле LR_IROM1 прописано RW_IRAM1 0x20000000 0x00020000, ведь эти адреса( 0x20000000 0x00020000) никак не входят в область 0x08000000 0x00080000 ?

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Вс фев 18, 2024 11:33:54
urry

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


; 060000 - 07FFFF cut for ext memory
LR_IROM1 0x08000000 0x0005FFFF  {    ; load region size_region
  ER_IROM1 0x08000000 0x0005FFFF  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00010000  {  ; RW data
   .ANY (+RW +ZI)
  }
  RW_IRAM2 0x20010000 0x00010000  {  ; RW data
  *.o (CCM_RW)
  }
}


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

volatile uint8_t ID_KEY[25]  __attribute__((section("CCM_RW")));

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Вс фев 18, 2024 14:50:52
maksimdag0
Так понимаю это пример, но по этому примеру я не могу найти ответы на заданные вопросы, пояснение не помешало бы)

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Вс фев 18, 2024 23:13:02
urry

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Вс фев 18, 2024 23:29:57
maksimdag0
Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял.
Самое важное, что я не понял что такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это?

Я представляю это так, если говорить абстрактно:

Написав программу(код), мы ее загружаем во flash микроконтроллера(МК), далее когда мы перезапускаем МК ядро начинает считывать инструкции программы с flash памяти начиная с 0x0 адреса(если, конечно, предварительно пинами BOOT установлена считывание с flash). Так вот, память flash получается это регион загрузки? И так как ядро выполняет программу из flash то она же считается и регионом выполнения?

Ну я думаю что я ошибаюсь

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Пн фев 19, 2024 09:59:21
urry
Да, конечно, ошибаетесь. Литературу Вы не дочитали - адрес старта в памяти программ начинается с адреса 0x08000000. Можно скорректировать - если в памяти программ находится бутлодер и основная программа , например, это фактически 2 разные программы. Переносится таблица векторов и так дальше. Я не могу здесь читать лекцию на 2 часа, начиная с архитектуры, отвечаю на конкретные вопросы.

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Пн фев 19, 2024 14:32:31
maksimdag0
Читать лекцию и не надо)
Конкретный вопрос следующий: что такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ?

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Пн фев 19, 2024 15:07:37
GARMIN
Загрузка начальных значений переменных перед стартом программы откуда осуществляется?

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Пн фев 19, 2024 16:27:56
maksimdag0
[uquote="GARMIN",url="/forum/viewtopic.php?p=4545054#p4545054"]Загрузка начальных значений переменных перед стартом программы откуда осуществляется?[/uquote]если речь идет за глобальные переменные, то из flash-памяти.

Сам код и глобальные переменные загружаются во flash память. После запуска глобальные переменные копируются в ОЗУ, а локальные создаются и удаляются в стеке в процессе выполнения программы

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Пн фев 19, 2024 18:19:26
urry
Издевается или троллит. Последняя моя ссылка в этой теме
http://www.vlsiip.com/c/embedded_c/xip.html#LRER

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Пн фев 19, 2024 18:43:36
maksimdag0
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4544905#p4544905"]Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял.[/uquote]
Вы читаете что я вам пишу? В самой теме еще это указал

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Вт фев 20, 2024 18:16:05
GARMIN
По буквам:
Загрузка начальных значений глобальных переменных перед стартом программы из какого региона flash-памяти осуществляется?

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Ср фев 21, 2024 13:40:36
maksimdag0
Как я знаю, они располагаются во flash до функции main(). В начале flash располагаются вектора прерывания, после располагаются значения глобальных переменных, далее функция main().

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Ср фев 21, 2024 15:10:49
VladislavS
Вообще говоря, это совершенно не обязательно так. А точнее, совсем не так.

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Ср фев 21, 2024 15:25:51
maksimdag0
Возможно. Потихоньку мы уходим от основного вопроса темы. Понимаю, все взаимно связано надо знать все, но мне кажется основной вопрос пояснить можно без этих доп. вопросов)

Re: Размещение кода по определенному адресу(Scatter-файл)

Добавлено: Ср фев 21, 2024 16:39:15
КРАМ
[uquote="maksimdag0",url="/forum/viewtopic.php?p=4545856#p4545856"]пояснить можно без этих доп. вопросов)[/uquote]
IRAM это область используемого ОЗУ. Причем тут флеш? Вы можете загрузить код в ОЗУ и вызвать его исполнение, но это процедура рантайма и к вопросу темы отношения не имеет.
Область загрузки и область исполнения во флеше (IROM) вами были интерпретированы верно.