Доброго вечера, форумчане! Подскажите, я не могу разобраться с вопросом, связанным со 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 ?
Я же написал, что я в интернете литературу читал, уточню, последние 3 дня, и эти статьи которые вы отправили тоже читал, но так и не понял. Самое важное, что я не понял что такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это?
Я представляю это так, если говорить абстрактно:
Написав программу(код), мы ее загружаем во flash микроконтроллера(МК), далее когда мы перезапускаем МК ядро начинает считывать инструкции программы с flash памяти начиная с 0x0 адреса(если, конечно, предварительно пинами BOOT установлена считывание с flash). Так вот, память flash получается это регион загрузки? И так как ядро выполняет программу из flash то она же считается и регионом выполнения?
Да, конечно, ошибаетесь. Литературу Вы не дочитали - адрес старта в памяти программ начинается с адреса 0x08000000. Можно скорректировать - если в памяти программ находится бутлодер и основная программа , например, это фактически 2 разные программы. Переносится таблица векторов и так дальше. Я не могу здесь читать лекцию на 2 часа, начиная с архитектуры, отвечаю на конкретные вопросы.
Загрузка начальных значений переменных перед стартом программы откуда осуществляется?
если речь идет за глобальные переменные, то из flash-памяти.
Сам код и глобальные переменные загружаются во flash память. После запуска глобальные переменные копируются в ОЗУ, а локальные создаются и удаляются в стеке в процессе выполнения программы
Как я знаю, они располагаются во flash до функции main(). В начале flash располагаются вектора прерывания, после располагаются значения глобальных переменных, далее функция main().
Возможно. Потихоньку мы уходим от основного вопроса темы. Понимаю, все взаимно связано надо знать все, но мне кажется основной вопрос пояснить можно без этих доп. вопросов)
IRAM это область используемого ОЗУ. Причем тут флеш? Вы можете загрузить код в ОЗУ и вызвать его исполнение, но это процедура рантайма и к вопросу темы отношения не имеет. Область загрузки и область исполнения во флеше (IROM) вами были интерпретированы верно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 11
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения