Apa implikasi dari menggunakan PROGMEM?

12

Dengan sejumlah besar variabel teks, saya merasa perlu untuk menyimpannya dalam memori Flash menggunakan PROGMEM . Apa konsekuensi positif dan negatif dari menyimpan variabel besar di Flash (menggunakan PROGMEM) vs SRAM vs EEPROM di Arduino?


sumber

Jawaban:

10

Berikut ini adalah perbandingan cepat FLASH, EEPROM dan SRAM pada AtMega328, mikrokontroler di banyak papan Arduino saat ini (tidak termasuk Due, Leonardo, Arduino lama dan beberapa papan kompatibel lainnya).

  • FLASH: 10.000 siklus tulis / hapus. Aksesnya cepat, tetapi lebih lambat dari SRAM. Kode diakses melalui PROGMEM.
  • EEPROM: 100.000 siklus tulis / hapus. Akses slooooooow, dalam milidetik. Prosedur akses yang relatif rumit.
  • SRAM: Siklus penulisan / hapus yang tidak terbatas. Aksesnya sangat cepat, 2 siklus clock. Akses langsung dengan kode.

Jadi, konsekuensi negatif utama hipotetis dari penggunaan PROGMEM adalah 10.000 siklus siklus tulis . Konsekuensi negatif utama dari menggunakan EEPROM adalah kompleksitas kode untuk membaca / menulis / menyalin data. SRAM, kapasitasnya sangat terbatas .

Anindo Ghosh
sumber
Di mana Anda mendapatkan info tentang akses EEPROM? Dari sedikit melihat tentang , sepertinya EEPROM dibaca membutuhkan waktu sekitar ~ 5 siklus jam. Menulis lambat, tetapi tidak membaca.
Connor Wolf
OP ingin menyimpan banyak barang.
Anindo Ghosh
Ya, tetapi apakah itu menulis sekali, banyak membaca, atau kebalikannya? "Variabel teks" kemungkinan adalah sesuatu yang ditentukan pada waktu kompilasi, dibakar ke perangkat, dan tidak pernah berubah setelah itu (mis. Teks menu atau sommat).
Connor Wolf
Saya membaca toko dalam pertanyaan sebagai "toko pada waktu kompilasi / unggah". Jika suatu variabel dimaksudkan untuk digunakan baca / tulis pada saat dijalankan, itu pasti tidak boleh disimpan dalam FLASH. Apakah tidak ada batasan tambahan bahwa FLASH tidak dapat dimodifikasi tanpa menghapus seluruh halaman terlebih dahulu?
microtherion
... variabel teks bukan konstanta string.
Anindo Ghosh
2

Implikasi utamanya adalah Anda tidak dapat mengubah informasi yang disimpan dalam PROGMEM. Anda juga akan mendapatkan hit kinerja (sangat kecil) karena string harus disalin 1 byte pada suatu waktu.

Keausan FLASH bukan masalah (utama) karena untuk membuat perubahan pada program Anda, Anda harus memprogram ulang FLASH.

Dengan pengenalan IDE 1.x, makro F () disertakan. Ini membuatnya lebih mudah untuk menjaga string dalam PROGMEM.

Misalnya alih-alih menggunakan: Serial.print ("Hello World!");

Anda sekarang dapat menggunakan:

Serial.print (F ("Hello World!");

Perhatikan, bahwa F () bukan fungsi, itu hanya makro sehingga penggunaannya agak terbatas.

baldengineer
sumber
1

PROGMEM paling baik digunakan untuk data yang tidak dapat diubah. Jika Anda akan terus mengubah variabel dengan cepat, saya hanya akan menyimpannya di SRAM. Di sisi lain, jika Anda ingin memiliki beberapa variabel teks yang tidak dapat diubah (mis. Hal-hal yang akan ditampilkan) yang tidak akan terlalu sering diambil, PROGMEM adalah ide yang bagus.

Mengenai EEPROM - cobalah untuk menyimpan ini untuk hal-hal yang persisten. IIRC lebih lambat untuk mengambil data dari EEPROM melalui SRAM / PROGMEM. Biasanya saya (dan lainnya) menyalin data dari EEPROM ke SRAM (Bahkan contoh resmi melakukan ini) sebelum menggunakannya.

Manishearth
sumber