Кто любит RISC в жизни, заходим, не стесняемся.
Сб фев 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 ?
Вс фев 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")));
Вс фев 18, 2024 14:50:52
Так понимаю это пример, но по этому примеру я не могу найти ответы на заданные вопросы, пояснение не помешало бы)
Вс фев 18, 2024 23:29:57
Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял.
Самое важное, что я не понял что такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это?
Я представляю это так, если говорить абстрактно:
Написав программу(код), мы ее загружаем во flash микроконтроллера(МК), далее когда мы перезапускаем МК ядро начинает считывать инструкции программы с flash памяти начиная с 0x0 адреса(если, конечно, предварительно пинами BOOT установлена считывание с flash). Так вот, память flash получается это регион загрузки? И так как ядро выполняет программу из flash то она же считается и регионом выполнения?
Ну я думаю что я ошибаюсь
Пн фев 19, 2024 09:59:21
Да, конечно, ошибаетесь. Литературу Вы не дочитали - адрес старта в памяти программ начинается с адреса 0x08000000. Можно скорректировать - если в памяти программ находится бутлодер и основная программа , например, это фактически 2 разные программы. Переносится таблица векторов и так дальше. Я не могу здесь читать лекцию на 2 часа, начиная с архитектуры, отвечаю на конкретные вопросы.
Пн фев 19, 2024 14:32:31
Читать лекцию и не надо)
Конкретный вопрос следующий: что такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ?
Пн фев 19, 2024 15:07:37
Загрузка начальных значений переменных перед стартом программы откуда осуществляется?
Пн фев 19, 2024 16:27:56
Загрузка начальных значений переменных перед стартом программы откуда осуществляется?
если речь идет за глобальные переменные, то из flash-памяти.
Сам код и глобальные переменные загружаются во flash память. После запуска глобальные переменные копируются в ОЗУ, а локальные создаются и удаляются в стеке в процессе выполнения программы
Пн фев 19, 2024 18:19:26
Издевается или троллит. Последняя моя ссылка в этой теме
http://www.vlsiip.com/c/embedded_c/xip.html#LRER
Пн фев 19, 2024 18:43:36
Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял.
Вы читаете что я вам пишу? В самой теме еще это указал
Вт фев 20, 2024 18:16:05
По буквам:
Загрузка начальных значений глобальных переменных перед стартом программы из какого региона flash-памяти осуществляется?
Ср фев 21, 2024 13:40:36
Как я знаю, они располагаются во flash до функции main(). В начале flash располагаются вектора прерывания, после располагаются значения глобальных переменных, далее функция main().
Ср фев 21, 2024 15:10:49
Вообще говоря, это совершенно не обязательно так. А точнее, совсем не так.
Ср фев 21, 2024 15:25:51
Возможно. Потихоньку мы уходим от основного вопроса темы. Понимаю, все взаимно связано надо знать все, но мне кажется основной вопрос пояснить можно без этих доп. вопросов)
Ср фев 21, 2024 16:39:15
пояснить можно без этих доп. вопросов)
IRAM это область используемого ОЗУ. Причем тут флеш? Вы можете загрузить код в ОЗУ и вызвать его исполнение, но это процедура рантайма и к вопросу темы отношения не имеет.
Область загрузки и область исполнения во флеше (IROM) вами были интерпретированы верно.
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.