заставить EEPROM.h использовать пользовательский раздел eeprom
Я создал приведенную ниже таблицу разделов для esp32 и заменил ею файл default_8MB.csv.
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0x9000, 0x5000,
otadata, data, ota, 0xe000, 0x2000,
app0, app, ota_0, 0x10000, 0x330000,
app1, app, ota_1, 0x340000,0x330000,
eeprom, data, 0x99, 0x670000,0x1000,
spiffs, data, spiffs, 0x671000,0x18f000,
После загрузки скетча я убедился, что таблица разделов правильно загружена во флэш-память по адресу 0x8000, используя esptool.py --port /dev/ttyACM1 read_flash 0x8000 0x300 partition_table.bin && gen_esp32part.py partition_table.bin && cat partition_table.bin
.
Теперь мой вопрос: что мне нужно сделать, чтобы библиотека EEPROM.h
сопоставила эмуляцию eeprom с адресом, который я указал в таблице разделов? Я наивно предположил, что EEPROM.h
будет автоматически использовать раздел с именем "eeprom", но это не так.
Я загрузил следующий тестовый скетч, чтобы проанализировать ситуацию:
#include <Arduino.h>
#include <EEPROM.h>
String s="this is a unique string";
void setup(){
EEPROM.begin(1024);
for (uint32_t i=0;i<s.length();i++){
EEPROM.write(i,s[i]);
}
EEPROM.commit();
Serial.println("EEPROM stored");
}
void loop() {
delay(10000);
}
После того, как скетч сохранил мою уникальную строку, я прочитал флэш-память с помощью esptool и ожидал найти строку со смещением 0x670000, но это не так. Вместо этого он должен храниться в другом месте, потому что я могу получить строку в другом скетче.
Одна вещь, которая меня смущает: я почти уверен, что когда-то заказывал ESP-WROOM32 с 4 МБ флэш-памяти, но автоматическое определение флэш-памяти esptool указывает, что моя плата имеет 8 МБ. Можно ли доверять этому обнаружению флэш-памяти или оно просто не работает, потому что я пытаюсь прошить 8 МБ на 4 МБ ESP32? Что должно произойти, если я создал таблицу разделов, превышающую размер флэш-памяти? Когда я устанавливаю таблицу разделов со смещением 10M, процесс сборки все еще не завершается сбоем (это то, что должно произойти?).
Мой главный вопрос: какие дополнительные шаги мне нужно предпринять, чтобы мой ESP работал с custom_partion_table.csv (кроме создания таблицы) и при использовании "EEPROM.h"?
@Sim Son, 👍0
Обсуждение1 ответ
Лучший ответ:
EEPROM на ESP32 работает не так, как вы ожидаете. Он использует систему хранения SDK «Энергонезависимая оперативная память» для хранения данных в разделе nvs
. Это работает через систему пар «ключ/значение», а данные хранятся в виде «BLOB» (большой двоичный объект) для ключа eeprom
в пространстве имен eeprom
. .
Каково внутреннее расположение данных внутри самого раздела, я понятия не имею (SDK имеет закрытый исходный код), но ваша строка не просто будет располагаться в начале раздела — она будет в начало BLOB, где бы он ни находился в разделе.
Раздел eeprom
больше не используется. Это просто пустая трата места.
Можно ли доверять этому обнаружению флэш-памяти или оно просто не работает, потому что я пытаюсь прошить 8 МБ на 4 МБ ESP32?
Боюсь, я не могу комментировать это. Я бы подумал, что он просматривает данные JEDEC чипа, но вместо этого он может просто просмотреть информацию таблицы разделов.
Что должно произойти, если я создал таблицу разделов, размер которой превышает размер флэш-памяти?
Возможно, немного, так как большая часть таблицы разделов относится к хранилищу данных или (в настоящее время) неиспользуемому разделу OTA.
Когда вы компилируете свой код, вы компилируете его только для раздела, в котором он будет находиться (например, app0). Когда вы загружаете код, вы загружаете только этот раздел. Все, что находится за пределами этого диапазона, не имеет отношения к компиляции/загрузке.
Когда я размещаю таблицу разделов со смещением 10 М, процесс сборки по-прежнему не прерывается (так и должно быть?).
Как я уже говорил, ему все равно. Раздел будет недоступен, так как на самом деле он не существует, а является просто записью в таблице. Компилятор не знает и не заботится о том, что это такое.
«это будет в начале BLOB, где бы он ни находился в разделе» - до сих пор у меня это работало так, как я ожидал (структура EEPROM была такой же, как в моем скетче), но, к сожалению, мне пришлось обновить arduino IDE, и теперь схема разделов, с которой я работал, больше не существует... Как вы загружаете содержимое eeprom?, @Sim Son
@SimSon Я предполагаю, что ядро перешло от ручной работы с флэш-чипом к использованию встроенной системы SDK. Упрощает реализацию ядра, но усложняет пользователю выполнение низкоуровневых операций. Лучше всего оставить EEPROM как внутреннюю только для скетча, и если вы хотите иметь данные, которые вы можете загрузить извне скетча, используйте SPIFFS., @Majenko
Я немного запутался, как мне использовать "SPIFFS извне"? Что делает esptool.py [...] write_flash [...]
(зависит ли это от типа раздела, в который я загружаю)? Насколько я понимаю, я могу загружать любые данные в произвольные области памяти, так какое это имеет отношение к SPIFFS, EEPROM или любому другому разделу, в который я хотел бы записать? С другой стороны, какие последствия имеет использование «SPIFFS извне»? Кажется, мне не хватает какого-то важного понимания, но я не знаю, где..., @Sim Son
SPIFFS — это файловая система, хранящаяся в разделе флэш-памяти. Существуют инструменты для создания и управления образом файловой системы SPIFFS на компьютере, который затем можно загрузить в ESP32 в нужном месте памяти для вашего раздела SPIFFS., @Majenko
Извините, я до сих пор не понимаю: почему я не могу просто загрузить постоянные данные (к которым я хотел бы получить доступ через EEPROM.h из скетча) с помощью esptool, как я делал до сих пор?, @Sim Son
и действительно ли мне нужен раздел с именем «eeprom», когда я использую EEPROM.h в своем скетче? Если нет, то где вместо этого EEPROM.h будет эмулировать eeprom? Может в SPIFFS?, @Sim Son
Вы не можете, потому что данные форматируются по-другому с текущей версией ядра. И да, вам обязательно нужен раздел с именем eeprom, если вы используете EEPROM.h в своем скетче., @Majenko
Итак, на моем компьютере мне нужно создать раздел SPIFFS (который отформатирован как раздел eeprom, который ожидает EEPROM.h), а затем я должен загрузить этот раздел SPIFFS на адрес моего раздела eeprom на esp? Я понял?, @Sim Son
Нет. Не совсем. SPIFFS не имеет ничего общего с EEPROM.h. Это файловая система. Вы используете его как SD-карту (но без SD-карты). На вашем компьютере вы создадите (в новой папке) файл с данными в нем (какой формат он принимает, зависит только от вас). Вы можете сделать несколько файлов, если хотите. Затем вы используете mkspiffs
, чтобы превратить эту папку в образ SPIFFS, который вы затем загружаете по адресу памяти раздела spiffs
. Затем вы используете SPIFFS.h
для доступа к нему, как к SD-карте., @Majenko
Существует множество руководств по ESP32 [здесь](https://www.dfrobot.com/index.php?route=DFblog/blogs&path=26) — многие из них посвящены SPIFFS., @Majenko
Давайте [продолжим это обсуждение в чате](https://chat.stackexchange.com/rooms/102878/discussion-between-sim-son-and-majenko)., @Sim Son
- ESP32: лучший способ встраивания сертификатов
- Как установить начальное значение eeprom при перепрошивке ESP32
- Esp32: загрузить файл eeprom
- Как читать и записывать EEPROM в ESP8266
- esp32, platformio A fatal error occurred: Packet content transfer stopped (received 8 bytes) *** [upload] Error 2
- avrdude: ошибка проверки, первое несоответствие в байте 0x0000 : 0x00 != 0x16 с использованием USBasp
- Нет заголовочных файлов (.h) в Documents\Arduino\libraries\arduino_144469 с демонстрационным кодом
- ESP32 в Arduino-IDE с FS.h и SPIFFS
EEPROM.h ищет расположение раздела по имени. В частности, он использует вызов SDK «nvs_open», чтобы открыть раздел с именем «eeprom». Поэтому он *должен* храниться в правильном месте., @Majenko