Запуск нескольких скетчей на Arduino

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

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

Решение 1

Использование AVRmultisketch Джона Макки.

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

Решение 2

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

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

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


person Max    schedule 25.08.2020    source источник
comment
IMO, 8-битный контроллер AVR не является подходящей целью для создания и запуска многозадачной операционной системы. Даже атмега644. Кстати: файл C++ должен быть переименован в .ino, но, конечно, вы несете ответственность за любой код, который вы компилируете.   -  person datafiddler    schedule 25.08.2020
comment
В гарвардской архитектуре вы можете запускать код только из программного пространства (которое SD-карта не является). Вы также не можете изменить его во время выполнения.   -  person gre_gor    schedule 26.08.2020
comment
Ваше намерение, упомянутое выше, не связано с тем, как работает 644 (или любой другой микроконтроллер или микропроцессор, если на то пошло). Выполнение кода начинается в одном и том же месте каждый раз при загрузке или сбросе. Прочитайте техническое описание. Тогда вы поймете, почему ваша идея не может работать так, как она сформулирована.   -  person TomServo    schedule 27.08.2020
comment
Можно ли использовать github.com/zevero/avr_boot для загрузки скетча с SD-карты, но есть программа-селектор в загрузчике или какая-то?   -  person Max    schedule 27.08.2020


Ответы (1)


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

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

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

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

с этим

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

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

fresult = pf_open(filename);

с этим

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

    fresult = pf_open(filename2);
}

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

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

person Max    schedule 27.08.2020