Размер раздела ESP32 и максимальный размер программы

arduino-ide esp32 partition

Из примера кода ESP32 я извлек следующую часть, которая просто выводит список разделов flash на консоль.

#include <string.h>
#include <assert.h>
#include "esp_partition.h"
#include "esp_log.h"

static const char *TAG = "example";

void setup(void)
{
    Serial.begin(115200);
    delay(200); // В противном случае первые записи в журнале будут потеряны
    ESP_LOGI(TAG, "Start test");
    esp_partition_iterator_t iter = esp_partition_find(ESP_PARTITION_TYPE_APP, ESP_PARTITION_SUBTYPE_ANY, NULL);
    ESP_LOGI(TAG, "Name, type, subtype, offset, length");
    while (iter != nullptr)
    {
      const esp_partition_t *partition = esp_partition_get(iter);
      ESP_LOGI(TAG, "%s, app, %d, 0x%x, 0x%x (%d)", partition->label, partition->subtype, partition->address, partition->size, partition->size);
      iter = esp_partition_next(iter);
    }
    
    esp_partition_iterator_release(iter);
    iter = esp_partition_find(ESP_PARTITION_TYPE_DATA, ESP_PARTITION_SUBTYPE_ANY, NULL);
    while (iter != nullptr)
    {
      const esp_partition_t *partition = esp_partition_get(iter);
      ESP_LOGI(TAG, "%s, data, %d, 0x%x, 0x%x (%d)", partition->label, partition->subtype, partition->address, partition->size, partition->size);
      iter = esp_partition_next(iter);
    }
    
    esp_partition_iterator_release(iter);

    
}

void loop()
{
}

В папке проекта у меня также есть файл пользовательских разделов.csv следующего содержания:

nvs,        data, nvs,      0x9000,  0x6000,
phy_init,   data, phy,      0xf000,  0x1000,
factory,    app,  factory,  0x10000, 512k,
storage,    data, ,         ,        0x40000,

Если я запущу код, он правильно отобразит пользовательские разделы с указанными выше размерами, все как и должно быть.

Однаков выводе сборки говорится, что программа использует 207278 байт из максимального значения 1310720. Если я изменю выбор схемы разделов в меню "Сервис", изменится второе число. Я бы ожидал, что максимальный размер будет равен размеру заводского раздела из пользовательской схемы разделов.

Если я изменю размер заводского раздела на 100 кб, ESP32 не загрузится и войдет в цикл перезапуска дампа ядра.

Это ошибка компилятора или я что-то упускаю из виду?

, 👍1


1 ответ


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

1

По-видимому, это ограничение цепочки инструментов. Результаты обработки файла partitions.csv не возвращаются компилятору для создания правильного сообщения. Различные схемы разделов, доступные в меню, взяты из boards.txt из пакета ESP32. Они могут быть обновлены, но будут перезаписаны при обновлении цепочки инструментов. Для ввода компилятором значение параметра в меню имеет значение, но фактический размер разделов берется из файла partitions.csv (если он существует).

Это означает, что необходимо вручную убедиться, что размер заводского раздела в файле csv больше или равен фактическому размеру кода. В идеале он также равен размеру выбранного раздела из меню (чтобы получить правильное сообщение и в конечном итоге ошибку, если размер двоичного файла превышает выделенное пространство).

Некоторые тесты показывают, что если фактический размер заводского раздела меньше размера кода (и меньше, чем ограничение на размер компилятора), приложение будет успешно построено и загружено, но не запустится. Чип войдет в цикл "запуск-перезагрузка-навсегда" и не выполнит никакого пользовательского кода. Однако, всегда ли это так, не гарантируется.

,