PROGMEM kullanarak Flash Belleğe yazabilir miyim?


11

Arduino'nun belgelerinde alıntı yapıyorum:

http://playground.arduino.cc/Learning/Memory Not: Flash (PROGMEM) bellek yalnızca program yazma sırasında doldurulabilir. Program çalışmaya başladıktan sonra> flaştaki değerleri değiştiremezsiniz.

Ve PROGMEM açıklamasında:

http://arduino.cc/tr/Reference/PROGMEM Verileri SRAM yerine flash (program) belleğinde saklayın. Bir Arduino kartında çeşitli bellek türlerinin bir açıklaması vardır.

PROGMEM anahtar sözcüğü bir değişken değiştiricidir, yalnızca pgmspace.h dosyasında tanımlanan veri türleriyle kullanılmalıdır. Derleyiciye SRAM yerine normalde bu bilgiyi flash belleğe koymasını söyler.

Öyleyse yapabilir miyiz, edemeyiz? Yoksa aynı şey değil mi?


Çalışma zamanında (flash) program belleğine yazabiliyorsanız (kilitli olmadıkça), işlem biraz daha karmaşıktır ve temel olarak sadece ayırma işlemini kontrol eden PROGMEM yönergesi ile gerçekleştirilemez. Bunun nasıl yapılabileceğini görmek istiyorsanız, bootloader kaynağına bakın.
Chris Stratton

Sayfa yazma blokları, flaşa yazma işlemini pratik yapmaz. Aslında bir şey dört gözle bekliyordu.
Anothercg Gmail

Yanıtlar:


9

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:


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.