заставить 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"?

, 👍0

Обсуждение

EEPROM.h ищет расположение раздела по имени. В частности, он использует вызов SDK «nvs_open», чтобы открыть раздел с именем «eeprom». Поэтому он *должен* храниться в правильном месте., @Majenko


1 ответ


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

2

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