Jawaban singkatnya adalah tidak: data PROGMEM hanya baca.
Batasan memori flash
Hal pertama yang harus dipahami adalah memori Flash (tempat ruang program) dirancang untuk penyimpanan tetap jangka panjang. Membaca darinya sangat cepat dan tepat. Namun, secara umum, Anda tidak dapat memodifikasinya berdasarkan byte-by-byte (misalnya mengubah variabel tertentu). Anda biasanya harus menghapus dan menulis ulang dalam blok besar. Itu membuatnya sangat tidak praktis untuk manipulasi run-time, karena Anda harus menyimpan banyak informasi yang berlebihan di tempat lain saat Anda menghapus dan menulis siklus.
Apa yang sebenarnya dilakukan PROGMEM
Setiap data literal yang ditentukan dalam kode Anda (seperti string dan angka) selalu berada di ruang program pada awalnya (yaitu dalam Flash). Namun, ketika sketsa Anda benar-benar ingin menggunakan data itu pada saat runtime, biasanya harus mengalokasikan beberapa ruang untuk itu dalam SRAM dan menyalinnya. Itu berarti Anda berakhir dengan dua salinan: asli tetap di Flash, dan salinan sementara di SRAM.
Ketika Anda menggunakan pengubah PROGMEM, Anda mengatakan untuk tidak membuat salinan kedua di SRAM. Sebagai gantinya, sketsa Anda hanya akan mengakses yang asli di Flash. Itu sangat berguna jika Anda hanya perlu membaca data, karena menghindari alokasi dan menyalin operasi.
Namun, menyalinnya ke SRAM sangat penting jika Anda ingin memodifikasi data. Selain dari batasan Flash yang saya sebutkan di atas, ini juga masalah keamanan kode.
Jika Anda dapat memodifikasi data yang disimpan dalam ruang program, maka secara logis Anda juga dapat mengubah kode yang disimpan dalam ruang program. Itu berarti bahwa kesalahan sederhana (atau secara teori serangan jahat) dapat mengakibatkan sketsa Anda ditulis ulang sebagian atau sepenuhnya pada saat run-time. Ini bisa memiliki hasil yang sangat tidak terduga, mulai dari berhenti bekerja, hingga merusak / menghancurkan peralatan yang terhubung.
Informasi lebih lanjut
Anda dapat mempelajari lebih lanjut tentang hal-hal PROGMEM tingkat rendah dari sini:
Versi lama dari tutorial PROGMEM yang sama tersedia di sini: