Всегда ли скрипт компоновщика определяет, по каким адресам размещен код - PullRequest
1 голос
/ 24 мая 2019

Я потратил большую часть своего времени на разработку микроконтроллеров с использованием инструментов и сред IDE, таких как Atmel Studio, и абстрагировался от того, что именно происходит за кулисами.

Допустим, в этом случае мы выполняем код непосредственно из флэш-памяти, что может иметь место во встроенных системах.

Когда мы разрабатываем приложение и прошиваем его на микроконтроллер, используя предоставленные инструменты от производителя микросхем, будет ли это загрузчик / флешер, который определяет, по какому физическому адресу в памяти будет мигать?

Я понимаю, что скрипт компоновщика определяет смещения памяти относительно того, где должны быть размещены различные разделы, такие как .data и .txt, так что именно это в конечном итоге определяет, по какому адресу во флэш-памяти mcu все должно идти?

Давайте теперь скажем, что я обнаружил часть флеш-памяти, которая вообще не используется, и я хочу поместить что-то еще (даже другое приложение), изменить ли сценарий компоновщика, создать новый или как мне написать в это конкретное место? Я еще не полностью понял это.

Ответы [ 2 ]

1 голос
/ 26 мая 2019

Ваша идея в целом верна.Сценарий компоновщика, представляющий собой не что иное, как файл со своим специализированным языком, который передает определенную информацию о памяти и о том, как их следует использовать, определяет расположение вашей программы в памяти.Некоторые линкеры также принимают такие спецификации памяти через параметры командной строки.

Что касается вашего конкретного вопроса, да, вы можете написать другую прошивку, которая занимает другие адреса памяти (чем первая), изменив скрипт компоновщика второго.В частности, начальный адрес образа программы.Это, конечно, ничего не говорит о том, как эти две части прошивки будут работать или взаимодействовать.Это отдельные вопросы.Вам также необходимо знать границу стираемого флэш-страницы MCU, чтобы вы могли поместить 2-е изображение в другую стираемую границу страницы.

В некоторых загрузчиках / программистах встроенного программного обеспечения вы также можете указать другое начальное смещениечем то, что указано в образе прошивки.Это отдельно от процесса сценария компоновщика.Для этого есть несколько применений.Например, ваша прошивка может быть построена для запуска из SRAM, а не напрямую из флэш-памяти.Поэтому при загрузке прошивки ее нужно будет перенести во флэш-память, а во время выполнения будет использоваться какой-то механизм для копирования кода из флэш-памяти в SRAM, где программа фактически будет работать.Есть и другие сценарии.

0 голосов
/ 28 мая 2019

Вы спросили, нужно ли вам изменить или создать новый скрипт компоновщика. Я бы потребовал, чтобы вы изменили захватывающий скрипт компоновщика. Я нахожу их время от времени довольно обширными. Зачем выбрасывать то, что там уже есть, при изменении его всего несколько строк.

Некоторые очень распространенные случаи, когда микроконтроллеры изменяют скрипт компоновщика:

  1. Добавление загрузчика в первый сектор флэш-памяти, в то время как фактическая программа запускается в более высоком секторе.
  2. Добавление сектора, предназначенного для хранения данных, сгенерированных приложением.
  3. Использование выделенного сектора для параметров конфигурации.

Позволяет использовать первое в качестве примера того, как записать в прошивку разные сектора флэш-памяти. Важно знать, что для этого примера загрузчик и само приложение представляют собой два отдельных проекта, каждый из которых имеет свою собственную конфигурацию компиляции или make-файл. Каждый проект также имеет свой собственный скрипт компоновщика. Ниже приведена часть обоих файлов:

Загрузчик:

/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x08000000, LENGTH = 16K
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

Заявка:

/* Specify the memory areas */
MEMORY
{
  FLASH (rx)      : ORIGIN = 0x0800C000, LENGTH = (1M - 16K)
  RAM (xrw)       : ORIGIN = 0x20000000, LENGTH = 128K
  MEMORY_B1 (rx)  : ORIGIN = 0x60000000, LENGTH = 0K
  CCMRAM (rw)     : ORIGIN = 0x10000000, LENGTH = 64K
}

Пожалуйста, не различайте определение FLASH. Флэш загрузчик запускается по умолчанию. Размер, выделенный для загрузчика, составляет 16 КБ. Важно отметить, что общий размер флэш-памяти примера чипа составляет 1M. Это видно по размеру вспышки проекта приложения. Но мы не разрешаем использовать полный 1М для приложения, поскольку, конечно, нам нужно уменьшить его на размер, выделенный для загрузчика. Вы также можете видеть, что он не начинается с того же адреса. Он имеет смещение 0xC000, что составляет 16k.

Прежде чем вы сможете запустить и отладить код приложения, вам нужно сделать еще две вещи:

  1. Определите смещение таблицы вектора вашего кода. Это необходимо, чтобы компилятор и компоновщик знали, где находится код в памяти. Вот где мне немного не хватает знаний по этой части, поэтому, если кто знает, уточните.
  2. Если вы хотите отладить ваше приложение, вы также должны указать отладчику, с чего начать. Atollic делает это через скрипт компоновщика. Из того, что я помню несколько лет назад, Atmel Studio имеет опцию в окне программирования, где вы можете установить смещение.

И последнее замечание: когда вы что-то связываете, лучше всего придерживаться секторов флэш-памяти чипа. Часто вы можете удалить только весь сектор. Размещение следующей части кода в начале следующего сектора упрощает работу.

Приведенные примеры основаны на файле компоновщика, сгенерированном Atollic TrueSTUDIO для STM32 для чипа STM32F4xx. Компиляция выполняется с использованием набора инструментов ARM gcc.

...