#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 с правильной конфигурацией. Однако это работает только с включенным вектором сброса загрузки. Я не уверен в причине этой проблемы, но пока этого хватит.