Menyimpan data di perangkat tanpa merusak flash: memahami tipe flash dan keterbatasan siklus tulis, memilih antara LittleFS dan FATFS, menerapkan wear leveling, serta merancang format data yang aman terhadap listrik mati, ditutup praktik sistem penyimpanan nyata

Firmware kalian sekarang punya data yang perlu bertahan: konfigurasi pengguna, kalibrasi sensor, log kejadian, atau data telemetry. Menyimpannya terlihat mudah — tinggal tulis ke flash — tapi flash itu mudah rusak. Setiap blok flash hanya bisa ditulis sejumlah kali tertentu sebelum aus, dan menulis di tengah listrik mati bisa mengkorup seluruh sistem file.
Episode ini membangun pemahaman tentang cara kerja flash, memilih filesystem yang tepat (LittleFS vs FATFS), menerapkan wear leveling, dan merancang data yang selamat dari kehilangan daya — keterampilan yang menentukan apakah produk kalian bertahan di lapangan selama bertahun-tahun.
Flash memory datang dalam dua keluarga dengan karakteristik berbeda:
| Aspek | NOR | NAND |
|---|---|---|
| Akses | Baca random cepat | Baca per blok/page |
| Tulis/erase | Lambat, per sektor | Lebih cepat, per blok besar |
| Endurance | ~10.000-100.000 siklus | ~1.000-10.000 siklus |
| Pemakaian | Kode program (MCU internal) | Storage data besar (SD card, eMMC) |
Fakta yang harus melekat di kepala: flash tidak bisa menulis ulang bit 0 menjadi 1 secara sembarang — hanya erase (per blok besar) yang bisa mengembalikan ke 1. Jadi menulis berarti: erase blok → tulis. Dan tiap erase "memakai" blok itu sekali. Datasheet endurance (misal 100.000 siklus) adalah batas per blok, bukan batas total — itulah mengapa distribusi tulis yang merata (wear leveling) begitu penting.
Jika firmware menulis log ke alamat yang sama berulang-ulang, satu blok akan aus dalam hitungan minggu sementara blok lain menganggur selamanya. Wear leveling menyebar penulisan ke seluruh flash sehingga umurnya dimaksimalkan:
Tanpa wear leveling:
[LOG][LOG][LOG][LOG][. ][. ][. ] <- blok LOG aus cepat, sisanya kosong
Dengan wear leveling (LittleFS):
[LOG][. ][LOG][. ][LOG][. ][LOG] <- tulis menyebar, umur memanjangCara sederhana menerapkan wear leveling tanpa filesystem: slot rotation — tulis ke beberapa slot secara bergantian. Cara modern: pakai LittleFS, yang wear-leveling dan power-loss-resilience-nya sudah tertanam di desain.
Note
Tip kritis untuk umur flash: hindari menulis terlalu sering. Logging tiap detik akan menghabiskan flash dalam hitungan bulan; logging tiap menit bisa bertahan bertahun-tahun. Sebelum menambahkan "simpan data", selalu tanya: seberapa sering benar-benar perlu? — jawabannya biasanya "lebih jarang dari yang kalian kira".
Untuk data di MCU, dua filesystem yang paling umum:
| Aspek | LittleFS | FATFS (FAT32) |
|---|---|---|
| Wear leveling | Ya, bawaan | Tidak |
| Power-loss safety | Ya, copy-on-write + CRC | Tidak; butuh ekstra |
| Kompatibilitas PC | Tidak langsung | Ya, mudah dibaca Windows |
| Resource | RAM kecil, cocok MCU | RAM sedang |
| Ideal untuk | Konfigurasi, log, data MCU | SD card yang dibawa ke PC |
Aturan praktis: data internal MCU → LittleFS; data yang harus dibuka di PC → FATFS (SD card). LittleFS menangani masalah yang paling sering membunuh produk (aus dan korupsi); FATFS menangani kompatibilitas.
Contoh menulis konfigurasi ke LittleFS (ESP-IDF):
#include "esp_littlefs.h"
#include <stdio.h>
void save_config(void) {
esp_vfs_littlefs_conf_t conf = {
.base_path = "/cfg",
.partition_label = "storage",
.format_if_mount_failed = true,
};
ESP_ERROR_CHECK(esp_vfs_littlefs_register(&conf));
FILE *f = fopen("/cfg/config.txt", "w");
if (f) {
fprintf(f, "sensor_id=42\ncalibration=1.25\n");
fclose(f); /* pastikan flush + sync sebelum listrik mati */
fsync(fileno(f));
}
}Perhatikan fsync — ia memaksa data ditulis ke flash sekarang, bukan nanti. Tanpa sync, "tulis berhasil" di log kalian bisa berarti "data hilang saat listrik mati".
Fakta menyakitkan di embedded: listrik bisa mati kapan saja, termasuk tepat di tengah penulisan flash. Tiga strategi standar agar data selamat:
fsync, baru rename (rename di sebagian besar filesystem atomic). LittleFS mendukung pola ini dengan baik.1. tulis config.new (lengkap + CRC)
2. fsync config.new
3. rename config.new -> config <- langkah ini atomic
4. baru hapus config lamaKesalahan umum: menulis langsung ke file "config" tanpa pola di atas — satu kali listrik mati di momen yang salah dan konfigurasi hilang atau korup, tanpa jejak recovery.
esp_littlefs).fclose sebelum fsync, boot ulang, dan lihat apakah data korup — lalu terapkan pola copy-on-write dan ulangi.fsync/flush — data "berhasil" tapi hilang saat listrik mati.Inti yang harus dibawa pulang:
Di episode 16 selanjutnya kita memastikan semua yang dibangun tetap terjaga: embedded testing & CI — unit test, HIL (hardware-in-the-loop), dan pipeline CI untuk firmware. Firmware yang tidak dites akan menagih utangnya berlipat di lapangan. Sampai jumpa di episode 16!