Kısa cevap hayır: PROGMEM verileri salt okunur.
Flash bellek sınırlamaları
Anlaşılması gereken ilk şey, Flash belleğin (program alanının yaşadığı yer) uzun süreli sabit depolama için tasarlanmış olmasıdır. Ondan okumak çok hızlı ve kesindir. Ancak, genel olarak konuşursak, bayt-byte-byte bazında değiştiremezsiniz (örn. Belirli bir değişkeni değiştirme). Genellikle büyük bloklarda silmeniz ve yeniden yazmanız gerekir. Bu, çalışma zamanı manipülasyonu için tamamen pratik değildir, çünkü silme ve yazma döngüsünü yaparken başka bir yerde çok fazla bilgi depolamanız gerekir.
PROGMEM gerçekte ne yapar Kodunuzda
belirtilen herhangi bir değişmez veri (dizeler ve sayılar gibi) her zaman önce program alanında (yani Flash'ta) bulunur. Bununla birlikte, çiziminiz aslında bu verileri çalışma zamanında kullanmak istediğinde, normalde SRAM'de bunun için bir miktar alan ayırmalı ve kopyalamalıdır. Bu, iki kopyayla sonuçlandığınız anlamına gelir: Flash'taki sabit orijinal ve SRAM'deki geçici kopya.
PROGMEM değiştiricisini kullandığınızda, SRAM'de ikinci kopyayı yapmamasını söylüyorsunuz. Bunun yerine, çiziminiz Flash'ta orijinal belgeye erişecektir. Verileri ayırma ve kopyalama işlemlerinden kaçındığı için yalnızca okumak zorunda kalırsanız çok kullanışlıdır .
Ancak, verileri değiştirmek istiyorsanız SRAM'a kopyalamak önemlidir. Yukarıda bahsettiğim Flash sınırlamalarının yanı sıra, bu bir kod güvenliği sorunudur.
Program alanında depolanan verileri değiştirebiliyorsanız, program alanında depolanan kodu da değiştirebilmeniz mantıklı bir şekilde gerçekleşir . Bu, basit bir hatanın (veya teoride kötü niyetli bir saldırının) çiziminizin çalışma zamanında kısmen veya tamamen yeniden yazılmasına neden olabileceği anlamına gelir. Bunun, basitçe işten ayrılmadan, bağlı ekipmanlara zarar vermek / imha etmek kadar çok öngörülemeyen sonuçlar olabilir.
Daha fazla bilgi
Düşük düzeyli PROGMEM öğeleri hakkında daha fazla bilgiyi buradan edinebilirsiniz:
Aynı PROGMEM öğreticisinin eski bir sürümünü burada bulabilirsiniz: