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

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение 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 ?
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение 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")));
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

Так понимаю это пример, но по этому примеру я не могу найти ответы на заданные вопросы, пояснение не помешало бы)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

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

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

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

Ну я думаю что я ошибаюсь
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Да, конечно, ошибаетесь. Литературу Вы не дочитали - адрес старта в памяти программ начинается с адреса 0x08000000. Можно скорректировать - если в памяти программ находится бутлодер и основная программа , например, это фактически 2 разные программы. Переносится таблица векторов и так дальше. Я не могу здесь читать лекцию на 2 часа, начиная с архитектуры, отвечаю на конкретные вопросы.
Контактная информация:
Реклама
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

Читать лекцию и не надо)
Конкретный вопрос следующий: что такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ?
Держит паяльник хвостом
Аватара пользователя
Сообщения: 958
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

Загрузка начальных значений переменных перед стартом программы откуда осуществляется?
Контактная информация:
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

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

Сам код и глобальные переменные загружаются во flash память. После запуска глобальные переменные копируются в ОЗУ, а локальные создаются и удаляются в стеке в процессе выполнения программы
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Издевается или троллит. Последняя моя ссылка в этой теме
http://www.vlsiip.com/c/embedded_c/xip.html#LRER
Контактная информация:
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

[uquote="maksimdag0",url="/forum/viewtopic.php?p=4544905#p4544905"]Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял.[/uquote]
Вы читаете что я вам пишу? В самой теме еще это указал
Держит паяльник хвостом
Аватара пользователя
Сообщения: 958
Зарегистрирован: Вс дек 02, 2012 16:58:33
Откуда: от туда

Сообщение GARMIN »

По буквам:
Загрузка начальных значений глобальных переменных перед стартом программы из какого региона flash-памяти осуществляется?
Контактная информация:
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

Как я знаю, они располагаются во flash до функции main(). В начале flash располагаются вектора прерывания, после располагаются значения глобальных переменных, далее функция main().
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Вообще говоря, это совершенно не обязательно так. А точнее, совсем не так.
Прорезались зубы
Сообщения: 225
Зарегистрирован: Чт апр 08, 2021 09:46:48

Сообщение maksimdag0 »

Возможно. Потихоньку мы уходим от основного вопроса темы. Понимаю, все взаимно связано надо знать все, но мне кажется основной вопрос пояснить можно без этих доп. вопросов)
Друг Кота
Аватара пользователя
Сообщения: 25553
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Сообщение КРАМ »

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

Вернуться в «ARM»