Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

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

Сб фев 17, 2024 20:20:09

Доброго вечера, форумчане!
Подскажите, я не могу разобраться с вопросом, связанным со 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

Код:

; 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

Так понимаю это пример, но по этому примеру я не могу найти ответы на заданные вопросы, пояснение не помешало бы)

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

Вс фев 18, 2024 23:13:02

https://www.keil.com/pack/doc/CMSIS/Cor ... ct_pg.html
https://habr.com/ru/articles/685028/
https://microsin.net/programming/arm-tr ... esses.html

дернуло же меня ответить...

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

Вс фев 18, 2024 23:29:57

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

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

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

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

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

Пн фев 19, 2024 09:59:21

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

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

Пн фев 19, 2024 14:32:31

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

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

Пн фев 19, 2024 15:07:37

Загрузка начальных значений переменных перед стартом программы откуда осуществляется?

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

Пн фев 19, 2024 16:27:56

Загрузка начальных значений переменных перед стартом программы откуда осуществляется?
если речь идет за глобальные переменные, то из flash-памяти.

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

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

Пн фев 19, 2024 18:19:26

Издевается или троллит. Последняя моя ссылка в этой теме
http://www.vlsiip.com/c/embedded_c/xip.html#LRER

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

Пн фев 19, 2024 18:43:36

Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял.

Вы читаете что я вам пишу? В самой теме еще это указал

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

Вт фев 20, 2024 18:16:05

По буквам:
Загрузка начальных значений глобальных переменных перед стартом программы из какого региона flash-памяти осуществляется?

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

Ср фев 21, 2024 13:40:36

Как я знаю, они располагаются во flash до функции main(). В начале flash располагаются вектора прерывания, после располагаются значения глобальных переменных, далее функция main().

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

Ср фев 21, 2024 15:10:49

Вообще говоря, это совершенно не обязательно так. А точнее, совсем не так.

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

Ср фев 21, 2024 15:25:51

Возможно. Потихоньку мы уходим от основного вопроса темы. Понимаю, все взаимно связано надо знать все, но мне кажется основной вопрос пояснить можно без этих доп. вопросов)

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

Ср фев 21, 2024 16:39:15

пояснить можно без этих доп. вопросов)

IRAM это область используемого ОЗУ. Причем тут флеш? Вы можете загрузить код в ОЗУ и вызвать его исполнение, но это процедура рантайма и к вопросу темы отношения не имеет.
Область загрузки и область исполнения во флеше (IROM) вами были интерпретированы верно.
Ответить