Bisakah saya menulis ke Memori Flash menggunakan PROGMEM?

11

Pada dokumentasi Arduino, saya kutip:

http://playground.arduino.cc/Learning/Memory Catatan: Memori Flash (PROGMEM) hanya dapat diisi pada waktu burn program. Anda tidak dapat mengubah nilai-nilai dalam flash setelah program mulai berjalan.

Dan pada deskripsi PROGMEM:

http://arduino.cc/en/Reference/PROGMEM Menyimpan data dalam memori flash (program) alih-alih SRAM. Ada deskripsi berbagai jenis memori yang tersedia di papan Arduino.

Kata kunci PROGMEM adalah pengubah variabel, kata itu harus digunakan hanya dengan tipe data yang didefinisikan dalam pgmspace.h. Ini memberitahu kompiler "memasukkan informasi ini ke dalam memori flash", bukannya ke SRAM, di mana ia biasanya pergi.

Jadi bisakah kita atau tidak? Atau bukan hal yang sama?

zzarbi
sumber
Meskipun Anda dapat menulis ke (flash) memori program pada saat dijalankan (kecuali jika terkunci), prosesnya sedikit lebih terlibat, dan tidak dapat diselesaikan dengan arahan PROGMEM, yang pada dasarnya hanya mengontrol proses alokasi. Jika Anda ingin melihat bagaimana hal itu dapat dilakukan, lihat sumber bootloader.
Chris Stratton
Blok tulis halaman tidak membuat penulisan menjadi flash menjadi tidak praktis. Bahkan sesuatu yang dinanti-nantikan.
Anothercg Gmail

Jawaban:

9

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:

Peter Bloomfield
sumber