Перейти к содержанию
    

Линкер-скрипт .sct - размещение секции

1 час назад, maksimdag0 сказал:

Я понял так...

Не так. Регион загрузки - это место, откуда код и данные будут загружены для последующего размещения в регионе выполнения. Код выполняется из региона выполнения. Как видно, в Вашем случае адрес региона выполнения совпадает с адресом региона загрузки, поэтому никаких копирований происходить не будет (зачем?). Адреса RAM другие - разумеется, промежуточному коду (до передачи управления main()) должно быть известно место, куда записывать начальные значения глобальных переменных - указан адрес 0x20000000. Откуда этим начальным значениям браться? Разумеется, из региона загрузки, поэтому регион RAM находится "внутри" региона загрузки LR_IROM1.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 часа назад, Arlleex сказал:

Регион загрузки - это место, откуда код и данные будут загружены для последующего размещения в регионе выполнения

Это до меня дошло, но я никак не могу понять самое важное - что же такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это?

 

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

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

 

Мне кажется, что это бред.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, maksimdag0 сказал:

Это до меня дошло, но я никак не могу понять самое важное - что же такое РЕГИОН ЗАГРУЗКИ и что такое РЕГИОН ВЫПОЛНЕНИЯ? Что это?

Области памяти в микроконтроллере.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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 в указанную область ОЗУ и передаст ей управление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Покурил, что вы написали..

 

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) ).

 

Правильно ли до меня дошло?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да, правильно. Только

19 минут назад, maksimdag0 сказал:

моя прошивка(весь код) загрузится(то есть прошьется) по адресу 0x08000000 размером 0x00040000

не таким размером, а минимально необходимым для образа прошивки. Размер 0x00040000 - это всего лишь размер, которым вы линкеру объясняете, что в МК потенциально столько вы можете выделить на размещение прошивки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Хорошо.

А если регионов загрузки больше одного, например как в примере ниже:

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) будет как то длиться?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...