Запустить шестнадцатеричную программу с SD с помощью другой программы

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

, 👍0

Обсуждение

это может сработать... https://arduino-forth.com/, @jsotola

Загрузчики, такие как Optiboot, принимают программу через UART и записывают ее во флэш-память MCU. Этот код находится в открытом доступе: https://github.com/Optiboot/optiboot/blob/master/optiboot/bootloaders/optiboot/optiboot.c. Приложив много усилий, вы тоже можете написать загрузчик, который загружает скомпилированный (или в шестнадцатеричном формате Intel) скетч с SD-карты через SPI. Ближайший проект к тому, который я смог найти, — это https://github.com/zevero/avr_boot, который ищет «FIRMWARE.BIN» на SD-карте, программирует внутреннюю флэш-память и запускает ее. Возможно, вы захотите изменить это ... или сделать это на другом MCU с меньшими ограничениями., @Maximilian Gerhardt

@MaximilianGerhardt, запишите загрузчик SD, а затем используйте библиотеку SD, чтобы скопировать выбранный файл в firmware.bin и выполнить сброс. новая прошивка должна иметь такую же возможность выбора прошивки, @Juraj

@MaximilianGerhardt Если вы хотите ответить на вопрос, отправьте ответ., @Nick Gammon


2 ответа


Лучший ответ:

0

Шестнадцатеричные файлы на SD-карте должны быть связаны для определенного адреса во flash. Обычная программа связана с нулевым адресом в ATmega, но загрузчики являются примером того, как связать конкретный адрес во flash.

Затем вы можете использовать функцию do_sdm(), предоставляемую Optiboot 8 (см. Пример), чтобы записать байты из шестнадцатеричного файла в нужное место во флэш-памяти. Следующим шагом будет вызов начального адреса как функции так же, как do_spm() становится доступным с помощью optiboot.h в приведенном примере.

typedef void (*loaded_function_t)();

const loaded_function_t loaded_function = (loaded_function_t)(ADDRESS_OF_LOADED_FUNCTION);

тогда вы можете использовать

  Serial.prinln("Execute the loaded code...);
  loaded_function();
  Serial.prinln("Loaded code finished.");
,

1) Извините, но я не понимаю, как связать HEX-файлы с SD-карты для определенного адреса во флэш-памяти. Как это сделать? 2) Я не нашел функцию do_sdm() в Optiboot. Что ты имел в виду?, @Andezit

2) в ответе есть ссылка 1) посмотреть как компилируются загрузчики и линкуются под конкретный адрес, @Juraj


0

Не с Уно, нет, это невозможно. Или это очень, очень сложно, и результаты будут менее желательными. Вам нужен правильный микроконтроллер с большим объемом оперативной памяти и возможностью запускать из него код, чего вы не можете сделать с Uno.

Было бы меньше труда написать свой собственный язык сценариев для управления вещами из текстового файла.

,