Перемещение кода и мест прерывания в Arduino

Мне нужно иметь возможность выбирать между двумя приложениями Arduino, работающими на atmega 1280 (megaavr) во время загрузки. Поэтому мне нужно переместить одно из этих приложений в другое место в памяти программ, и мне также нужно переместить прерывания в это место.

У меня уже есть метод выполнения правильных прерываний (с помощью загрузчика) в любом месте памяти.

Однако я недостаточно понимаю процесс сборки, чтобы понять, где компоновщик решает, куда поместить элементы и как переместить разделы программы и прерывания в новые области памяти.

  • Где определяется местоположение вектора прерывания?
  • Где определяется местонахождение программы?

Текущие сборки выполняются с использованием Arduino 22. Хотя я бы предпочел модифицировать сценарии сборки или файлы в этой среде, при необходимости я бы рассмотрел возможность переноса всего этого в процесс сборки makefile и из среды Arduino.

Ответы (2)

Я предварю этот ответ, сказав, что никогда не пытался это сделать. При этом Arduino — это просто слой поверх avr-libc/avr-gcc. В FAQ руководства пользователя объясняется , как найти код по фиксированному адресу, и я думаю, вы сможете сделать это точно так же в исходном коде Arduino. Arduino IDE написана на Java, и исходный код доступен — вы можете изменить файл Compiler.java, чтобы добавить необходимые флаги в компоновщик (например, -Wl,--section-start), чтобы найти ваш код. Но я бы не советовал идти по этому пути.

Что было бы лучше, так это попробовать использовать Eclipse в качестве Arduino IDE (много информации в Интернете о том, как это сделать), вы можете просто установить там настройки компоновщика, как обычно. Гораздо более прямолинейно.

AVRGCC загружает прерывания и программу в один и тот же раздел, причем сначала прерывания. Секция просто помечена .text, поэтому компилятору нужно передать только один флаг, чтобы переместить и прерывания, и программу:

-Wl,--section-start=.text=0x10000 # Exactly 1/2 of a 128k device

В конечном итоге я выбрал пользовательский Makefile(в Интернете есть множество примеров make-файлов Arduino), а не пытался сделать это внутри Arduino. Это позволит мне дополнительно настроить процесс сборки и для других частей проекта.

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