NVS access issue when app size >8MB and PSRAM enabled
Posted: Sat Nov 23, 2024 9:02 am
In the project ESP32-S3R8 with 8MB of PSRAM and external 16MB of Flash is used.
We use custom partition table to have a small NVS partition and a large App partition (15Mb) and no OTA partition.
Project works when App size is less than 8MB and PSRAM is enabled. No error in accessing the NVS partition.
As soon as App size become greater than 8MB and PSRAM is kept enabled. Error generated on accessing the NVS data – (NVS partition not available)
Also even when App size is greater than 8MB but PSRAM is disabled. No error in accessing the NVS partition.
Error message:
E (2081) partition: load_partitions returned 0x101
ESP_ERROR_CHECK failed: esp_err_t 0x105 (ESP_ERR_NOT_FOUND) at 0x420084f8
0x420084f8: app_main at /main.c:18 (discriminator 1)
NVS access error in this code
Looks like when App size is greater than 8MB + PSRAM is enabled than NVS partition access generates error (load_partitions returned 0x101).
A small project is attached to demonstrate this effect.
In this project an external bin file (MyFile.bin) containing a large size array is accessed from the App. By varying the data size of the bin file, overall app size can be made greater or less than 8MB.
The PSRAM usage is enabled / disabled using the menu-config option. (menuconfig -- ESP PSRAM -- Support for external, SPI-connected RAM)
In the project, at the beginning, a variable is accessed from the NVS storage area, incremented and stored back to NVS.
Any guidance/hint at solving the NVS partition access when App size is greater than 8MB and PSRAM enabled is appreciated.
Custom partition table:
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0xA000, 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, 0x100000, 15M,
We use custom partition table to have a small NVS partition and a large App partition (15Mb) and no OTA partition.
Project works when App size is less than 8MB and PSRAM is enabled. No error in accessing the NVS partition.
As soon as App size become greater than 8MB and PSRAM is kept enabled. Error generated on accessing the NVS data – (NVS partition not available)
Also even when App size is greater than 8MB but PSRAM is disabled. No error in accessing the NVS partition.
Error message:
E (2081) partition: load_partitions returned 0x101
ESP_ERROR_CHECK failed: esp_err_t 0x105 (ESP_ERR_NOT_FOUND) at 0x420084f8
0x420084f8: app_main at /main.c:18 (discriminator 1)
NVS access error in this code
- #include <stdio.h>
- #include "freertos/FreeRTOS.h"
- #include "freertos/task.h"
- #include "nvs_flash.h"
- #include "nvs.h"
- #include "esp_log.h"
- extern uint8_t MyFile_bin_start[] asm("_binary_MyFile_bin_start");
- int cnt=0;
- void app_main(void)
- {
- // Initialize NVS
- esp_err_t err = nvs_flash_init();
- if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND)
- {
- ESP_ERROR_CHECK(nvs_flash_erase());
- err = nvs_flash_init();
- }
- ESP_ERROR_CHECK(err);
- vTaskDelay(20 / portTICK_PERIOD_MS);
- nvs_handle_t nvs_handle;
- // Open NVS handle
- err = nvs_open("nvs", NVS_READWRITE, &nvs_handle);
- if (err != ESP_OK)
- {
- ESP_LOGI("MyLog", "Error (%s) opening write NVS handle!\n", esp_err_to_name(err));
- return;
- }
- // Read array from NVS under the provided key
- size_t required_size = 1 * sizeof(int);
- err = nvs_get_blob(nvs_handle, "cntData", &cnt, &required_size);
- if (err == ESP_OK)
- {
- ESP_LOGI("MyLog", "Array for key cntData retrieved successfully!\n");
- // for (int i = 0; i < size; i++) {
- // ESP_LOGI("MyLog","Array[%d] = %d\n", i, arr[i]);
- // }
- }
- else
- {
- ESP_LOGI("MyLog", "Error (%s) reading key %s!\n", esp_err_to_name(err), "cntData");
- }
- cnt++;
- // Write array to NVS under the provided key
- err = nvs_set_blob(nvs_handle, "cntData", &cnt, required_size);
- if (err != ESP_OK)
- {
- ESP_LOGI("MyLog", "Error (%s) writing to key %s!\n", esp_err_to_name(err), "cntData");
- }
- // Commit write
- err = nvs_commit(nvs_handle);
- if (err != ESP_OK)
- {
- ESP_LOGI("MyLog", "Error (%s) committing!\n", esp_err_to_name(err));
- }
- // Close NVS handle
- nvs_close(nvs_handle);
- ESP_LOGI("MyLog", "Cnt value: %d", cnt);
- cnt = MyFile_bin_start[0]; //array from external linked bin file
- }
A small project is attached to demonstrate this effect.
In this project an external bin file (MyFile.bin) containing a large size array is accessed from the App. By varying the data size of the bin file, overall app size can be made greater or less than 8MB.
The PSRAM usage is enabled / disabled using the menu-config option. (menuconfig -- ESP PSRAM -- Support for external, SPI-connected RAM)
In the project, at the beginning, a variable is accessed from the NVS storage area, incremented and stored back to NVS.
Any guidance/hint at solving the NVS partition access when App size is greater than 8MB and PSRAM enabled is appreciated.
Custom partition table:
# Name, Type, SubType, Offset, Size, Flags
nvs, data, nvs, 0xA000, 0x6000,
phy_init, data, phy, , 0x1000,
factory, app, factory, 0x100000, 15M,