Запуск нескольких эскизов на Arduino

#arduino #android-sdcard #bootloader

#arduino #android-sdcard #загрузчик

Вопрос:

В настоящее время я использую пользовательскую плату, которая работает на ATMEGA644P с подключаемым TFT-дисплеем. Я хочу запустить на нем два отдельных эскиза, один из которых представляет собой сложный код с открытым исходным кодом, написанный на C, а другой — мой собственный код, который я закодировал в Arduino. Объединение этих двух довольно сложно и отнимает много времени, поскольку они не работают в одних и тех же основных библиотеках.

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

Решение 1

С помощью AVRmultisketch Джона Макки.

Для этого используется пользовательское приложение, которое компилирует несколько файлов ino и эскиз селектора, в котором эскиз селектора устанавливает начальный адрес эскиза в памяти. Основная проблема с этим заключается в том, что один из моих эскизов недоступен в формате ino.

Решение 2

Загрузка с SD-карты.

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

Есть ли какие-либо руководства или методы, которые я могу использовать для достижения своей цели?

Комментарии:

1. IMO 8-битный контроллер AVR не является подходящей целью для создания и запуска многозадачной операционной системы. Даже atmega644. Кстати: файл c должен быть переименован в .ino, но, конечно, вы несете ответственность за любой код, который вы компилируете.

2. В Harvard architecture вы можете запускать код только из программного пространства (чего нет на SD-карте). Вы также не можете изменить его во время выполнения.

3. Ваше «намерение», упомянутое выше, заключается не в том, как работает 644 (или любой другой микроконтроллер или микропроцессор, если на то пошло). Выполнение кода начинается в одном и том же месте при каждой загрузке или сбросе. Прочитайте таблицу данных. Тогда вы поймете, почему ваша идея не может работать так, как сформулировано.

4. Можно ли использовать github.com/zevero/avr_boot это для загрузки эскиза с SD-карты, но в загрузчике есть программа выбора или что-то в этом роде?

Ответ №1:

Итак, я не уверен, что это единственный или наилучший способ, но мне удается сделать это с помощью загрузчика avr_boot, который загрузит эскиз с SD-карты при загрузке. Я успешно протестировал его с arduino nano (ATMEGA328P).

Во-первых, убедитесь, что файлы по умолчанию могут быть скомпилированы. Затем измените Makefile в соответствии с руководством. Адрес загрузки может быть вычислен путем умножения адреса загрузки на 2. Например, адрес загрузки для ATMEGA328P, где бит высокого предохранителя установлен в 0xD8, равен 0x7000 . Также обратите внимание на CS-PIN-код SD-карты.

Затем измените файл main.c для строки 39

 const char filename[13] ="FIRMWARE.BIN";
  

с помощью этого

 const char filename1[14] ="FIRMWARE1.BIN";    // EDIT FILENAME HERE
const char filename2[14] ="FIRMWARE2.BIN";
  

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

 fresult = pf_open(filename);
  

с помощью этого

 DDRB amp;= ~(1 << PB1);
if ((PINB amp; (1 << PB1)))   /* test button pressed */
{
    fresult = pf_open(filename1);   
}else{

    fresult = pf_open(filename2);
}
  

Я использую PB1 в качестве вывода селектора. Следовательно, он откроет filename1 при его высоком значении и filename2 при его низком значении. Теперь каждый раз, когда чип загружается, он проверяет состояние PB1 и загружает правильный эскиз с SD-карты. Это может занять некоторое время в зависимости от размера ваших эскизов. Это также приведет к износу ПРОГРАММНОЙ ПАМЯТИ 10000 циклов записи, что в любом случае много. Возможное исправление — отключить вектор сброса загрузки, установив бит высокого предохранителя на 0xD9. Это позволит ему входить в загрузчик только при нажатии кнопки сброса, а не при включении.

Мне удалось заставить это работать и на ATMEGA644PA с правильной конфигурацией. Однако это работает только с включенным вектором сброса загрузки. Я не уверен в причине этой проблемы, но пока этого хватит.