Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба 1 час назад, maksimdag0 сказал: Я понял так... Не так. Регион загрузки - это место, откуда код и данные будут загружены для последующего размещения в регионе выполнения. Код выполняется из региона выполнения. Как видно, в Вашем случае адрес региона выполнения совпадает с адресом региона загрузки, поэтому никаких копирований происходить не будет (зачем?). Адреса RAM другие - разумеется, промежуточному коду (до передачи управления main()) должно быть известно место, куда записывать начальные значения глобальных переменных - указан адрес 0x20000000. Откуда этим начальным значениям браться? Разумеется, из региона загрузки, поэтому регион RAM находится "внутри" региона загрузки LR_IROM1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimdag0 0 18 февраля Опубликовано 18 февраля · Жалоба 3 часа назад, Arlleex сказал: Регион загрузки - это место, откуда код и данные будут загружены для последующего размещения в регионе выполнения Это до меня дошло, но я никак не могу понять самое важное - что же такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это? Я представляю это так, если говорить абстрактно: Написав программу(код), мы ее загружаем во flash микроконтроллера(МК), далее когда мы перезапускаем МК ядро начинает считывать инструкции программы с flash памяти начиная с 0x0 адреса(если, конечно, предварительно пинами BOOT установлена считывание с flash). Так вот, память flash получается это регион загрузки? И так как ядро выполняет программу из flash то она же считается и регионом выполнения? Мне кажется, что это бред. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба 1 час назад, maksimdag0 сказал: Это до меня дошло, но я никак не могу понять самое важное - что же такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это? Области памяти в микроконтроллере. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля Опубликовано 18 февраля · Жалоба 1 час назад, maksimdag0 сказал: Мне кажется, что это бред. В зависимости от типа МК его старт может начинаться из разных мест. Но типовой старт - да, из встроенной Flash-памяти. С точки зрения МК нет никаких регионов - у него всего лишь Flash-ка припаяна и какой-то объем ОЗУ. Чтобы запустить выполнение какой-то программы, написанной на Си, некий "кто-то" должен правильным образом "подготовить" почву для запуска кода - инициализировать переменные, например. Это тоже некий код-прослойка, запускаемый до перехода на вашу функцию main(). Но, поскольку для генерации этого кода-прослойки линковщику нужно знать, сколько переменных у Вас в коде, чем они должны инициализироваться, где (по каким адресам) памяти должны располагаться и т.д., линковщику подсовывается скрипт, в котором описываются регионы памяти. Сгенерированный код-прослойка "копирует" код и/или данные из адресов, помеченных в скрипте как "регион загрузки", в "регион выполнения", и управление передается в main(). Вот Ваш пример: 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 - это регион загрузки. По сути, кусок Flash-памяти, где будет храниться "образ" Вашей программы (и код, и данные). Внутри этого региона указываются регионы исполнения. Регион ER_IROM1 содержит секции кода и read-only (const) данных, и расположен в том же адресном пространстве, где его родительский регион загрузки (связано это, в первую очередь, с тем, что в этом регионе находятся т.н. "корневые" секции InRoot&&Sections). Код сюда не копируется, потому что иначе получится проблема курицы и яйца - для загрузки кода копирования он должен быть куда-то загружен, а загружен каким-то кодом, который должен сам где-то храниться и т.д. Регион RW_IRAM1 описывает ОЗУ - указаны адреса реально припаянной ОЗУ в МК. Находится этот регион внутри того же региона загрузки LR_IROM1, т.е. всякие инициализирующие значения для глобальных переменных будут присвоены им именно из области памяти региона ER_IROM1. Приведу еще один пример. Например, Ваш МК умеет выполнять код из ОЗУ. Разумеется, при включении питания в ОЗУ находится мусор и программа как-то должна туда попасть. Образ прошивки по-прежнему будет храниться во Flash, т.к. прошивка оттуда не исчезает при выключении питания. Вот и описывается в скрипте линкера, что регион загрузки (LR) находится во Flash, а регион исполнения (ER) - в ОЗУ. Тот самый код-прослойка при включении питания скопирует образ прошивки из Flash в указанную область ОЗУ и передаст ей управление. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimdag0 0 19 февраля Опубликовано 19 февраля · Жалоба Покурил, что вы написали.. 18 часов назад, Arlleex сказал: Сгенерированный код-прослойка "копирует" код и/или данные из адресов, помеченных в скрипте как "регион загрузки", в "регион выполнения", и управление передается в main(). В итоге я понял так: в Scatter-файле,когда мы в регионе загрузке(LR_IROM1) указываем адреса(в моем примере это LR_IROM1 0x08000000 0x00080000), то мы говорим что наша написанная программа(глобальные переменныe, код прослойки, в общем весь код) была загружена и хранилась там по этим адресам(начиная с адреса0x08000000). То есть весь код будет хранится начиная с адреса 0x08000000(то есть во flash). Далее мы записываем регион выполнения (ER_IROM1) и указываем адреса(в моем примере это ER_IROM1 0x08000000 0x00080000), это значит что мы говорим в какую область памяти мы должно скопировать данные из области загрузки. В моем примеры эти адреса равны, но если рассматривать такой пример(исправил адреса на абум для примера): LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x00040000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } } в данном примере получается, что моя прошивка(весь код) загрузится(то есть прошьется) по адресу 0x08000000 размером 0x00040000, а выполнение кода начнется с адреса 0x00040000, так как адрес региона исполнения равен 0x00040000(ER_IROM1). То есть будет скопирован код из области памяти, адрес который 0x08000000(из региона загрузки LR_IROM1 ), в область памяти, адрес которой 0x00040000(в регион исполнения ER_IROM1), а именно будет скопирован то код, сегметы которыех указаны в теле региона исполнения(то есть: *.o (RESET, +First), *(InRoot$$Sections), .ANY (+RO) ). Правильно ли до меня дошло? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 19 февраля Опубликовано 19 февраля · Жалоба Да, правильно. Только 19 минут назад, maksimdag0 сказал: моя прошивка(весь код) загрузится(то есть прошьется) по адресу 0x08000000 размером 0x00040000 не таким размером, а минимально необходимым для образа прошивки. Размер 0x00040000 - это всего лишь размер, которым вы линкеру объясняете, что в МК потенциально столько вы можете выделить на размещение прошивки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimdag0 0 19 февраля Опубликовано 19 февраля · Жалоба Хорошо. А если регионов загрузки больше одного, например как в примере ниже: LR_IROM1 0x08000000 0x00040000 { ; load region size_region ER_IROM1 0x08000000 0x00040000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) startup_stm32f4.o } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } } LR_IROM1 0x08040000 0x00020000 { ER_IROM1 0x08040000 0x00020000 { ; load address = execution address .ANY (+RO) } } получается ,в таком примере, размер области для загрузки образа программы выделится равным 0x00040000+0x00020000=0x00060000? И программа по этим отдельным региона загрузки(0x08000000 и 0x08040000) будет как то длиться? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 19 февраля Опубликовано 19 февраля · Жалоба Да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimdag0 0 19 февраля Опубликовано 19 февраля · Жалоба Понял. Спасибо большое! Один ответ ваш и все дошло!) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться