我们团队的项目使用 wear_levelling 示例项目中演示的 FatFs 文件系统来嵌入三个文本文件,每个文件最大 4KB。在 FAT 数据分区上启用闪存加密后,我们注意到第二个或第三个文件会周期性地完全损坏小字符串,或者在大文件的后半部分损坏。每次擦除并重新格式化闪存分区后都会出现这种情况,删除和替换文件后偶尔也会出现这种情况。对于给定的文件,损坏的值似乎是一致的
在启用闪存加密和安全启动 v2 的 ESP32-PICO-MINI-02 devkit 上进行一些修改后,在 wear_levelling 示例中重新创建了此行为。进一步的实验表明,当在 sdkconfig 中将 WL_SECTOR_SIZE 设置为 4096 或 0xB1000 字节(扇区大小为 512)时,当 FAT 分区大小至少为 0x84000 字节大时,该问题将消失。
闪存加密文档中指出,NVS存储库与闪存加密不兼容,但我们找不到对 FatFs 库的直接引用。闪存加密与 FAT 文件系统兼容吗?如果是这样,除了 FatFs 文档中描述的要求之外,是否还有其他最小分区大小要求以确保正常运行?
修改后的 wear_levelling 示例代码:
代码:
全选
void app_main(void)
{
ESP_LOGI(TAG, "Moun
ting FAT filesystem");
// To mount device we need name of device partition, define base_path
// and allow format partition in case if it is new one and was not formated before
const esp_vfs_fat_mount_config_t mount_config = {
.max_files = 4,
.format_if_mount_failed = true,
.allocation_unit_size = CONFIG_WL_SECTOR_SIZE
};
esp_err_t err = esp_vfs_fat_spiflash_mount(base_path, "storage", &mount_config, &s_wl_handle);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Failed to mount FATFS (%s)", esp_err_to_name(err));
return;
}
ESP_LOGI(TAG, "Opening file");
FILE *f = fopen("/spiflash/hello.txt", "wb");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for writing");
return;
}
fprintf(f, "written using ESP-IDF %sn", esp_get_idf_version());
fclose(f);
ESP_LOGI(TAG, "File written");
// Open file for reading
ESP_LOGI(TAG, "Reading file");
f = fopen("/spiflash/hello.txt", "rb");
if (f == NULL) {
ESP_LOGE(TAG, "Failed to open file for reading");
return;
}
char line[128];
fgets(line, sizeof(line), f);
fclose(f);
// strip newline
char *pos = strchr(line, 'n');
if (pos) {
*pos = '