Включить бинарный файл в прошивку

Тема в разделе "ESP8266, ESP32", создана пользователем Randy909, 3 фев 2020.

  1. Randy909

    Randy909 Нерд

    Давно ищу возможность включить бинарные данные в прошивку esp8266.

    Видел и такое предложение:
    Код (C++):
    const char picture[] PROGMEM = R"=====(
    #include "picture.bmp"
    )====="
    ;
    Но не работает. :(
     
  2. Vovka

    Vovka Гик

    Можно перегнать "picture.bmp" в текстовый "picture.h" ;)
     
  3. Randy909

    Randy909 Нерд

    Да, конечно. Потом перекодировать обратно. Но хочется избежать этой ручной работы - просто положил другой файл, компильнул и всё работает.
     
  4. Vovka

    Vovka Гик

    Зачем? Пишите обычную инициализацию массива в "picture.h":
    0x22,0x16,0x65,....
     
    Алексей.А нравится это.
  5. Перед преобразованием файла к виду, который понимает компилятор, можно этот файл немножко зажать, если это эффективно.
    На маленьких bmp скорее всего бесполезно, зажимая ничего не выиграть.
    На тексте, зажимая скрипты стили и т.п. (тот же джиквери) и преобразуя их в исходный код для компиляции при сборке, можно получить выигрыш.
    Один раз пишете скрипт, который сканирует директорию data в директории со скетчем, найденные там файлы преобразует.
    Сохраняете этот скрипт в директорию со скетчем.
    Для выбранной платформы в обработчике recipe.hooks.sketch.prebuild проверяете есть-ли скрипт в директории со скетчем, если скрипт присутствует, выполняете.
    Таким образом, добавляя/изменяя файлы для web сервера при выполнении сборки получаете актуальный код.

    П.С.
    Прежде хранил файлы для web-а на spiffs, но грузятся они тулзом на этот spiffs безумно долго, и иногда просто забывал после загрузки исполняемого кода загрузить файлы на spiffs.
    Забросил это, html контент держу в собраноом коде, во время сборки налету преобразую файлы.
     
    Последнее редактирование: 3 фев 2020
    Randy909, KindMan и b707 нравится это.
  6. b707

    b707 Гуру

    Алексей, очень полезно, спасибо за рецепт.
    С бинарными файлами понятно - вы их преобразуете в массивы HEX значений.
    А с HTML и CSS что делаете? неужели в строчки String заворачиваете?
     
  7. KindMan

    KindMan Гуру

    Да, мне тоже интересно. Я gzip пользую.
     
  8. всё собираю в массивы байтов типа
    Код (Text):
    static const char _bla_bla[] PROGMEM = {...};
    для записи этих данных использую sendContent_P
    Во время сборки инициализирую структуры, описывающие контент - имя ресурса, тип контента, сжатие (если есть), указатель на данные и длину.
    Серверу остается только найти по имени запрошенного uri соответствующую запись и отгрузить данные установив соответствующие типы.
    Пример тут.
    Ган-зип прекрасно с этим справляется, один раз сделал скрипт, и жму налету при сборке.
    Да ещё входит в состав ОС, ничего доставлять не требуется.
     
    Последнее редактирование: 3 фев 2020
  9. Randy909

    Randy909 Нерд

    Спасибо большое! Насчет скрипта - это хорошо.
    Но всё равно это как-то уж слишком по советски - одна программа разворачивает бинарник в текст, чтобы потом 2-я программа вернула этот текст к первоначальному бинарному виду и залила его на устройство... :(
    Неужели нет бо-ме простого способа тупо присоединить бинарник к прошивке?!
     
  10. parovoZZ

    parovoZZ Гуру

    Почему по-советски? Всегда так было - на каждую линейку процев предоставляется тулчейн с кучей разных утилит - компилятор, линковщик, прошивальщик и пр.
     
  11. Randy909

    Randy909 Нерд

    Потому что, чтобы закачать бинарник, надо из него сделать текст и тогда компилятор сделает из него бинарник...
     
  12. parovoZZ

    parovoZZ Гуру

    Напиши свой алгоритм извлечения из памяти данных вместе с прошивальщиком. Как пример, ищем на форуме esp8266 файловую помойку для esp8266.
     
  13. Randy909

    Randy909 Нерд

    Зачем?! Достаточно было разрешить что-то типа
    Код (C++):
    byte a[] = {
    #include asdasd.bmp
    }
    И всё...
     
    parovoZZ нравится это.
  14. Директива #include указывает компилятору (точнее препроцессору) включить другой исходный файл.
    Пользовался стандартом ISO/IEC 9899:2018 Information technology — Programming languages — C
    Раздел 5.1 Conceptual models, параграф 5.1.1.1 Program structure
    Не нашел про иное использование #include, откуда такая информация про включение бинарных файлов как исходных?
     
  15. Randy909

    Randy909 Нерд

    Мдя... Всё-таки прочитай, что я написал в посте над кодом... :)
    А за скрипты всё равно спасибо! :)