Arduino Bellek Yönetimi: RAM Dışı Kalma Sorunlarını Tanımak
Arduino kartları (Uno, Nano) sadece 2KB RAM'e sahiptir. String'ler, diziler ve kütüphaneler hızla belleği doldurur. Bellek bittiğinde program çöker, garip davranışlar başlar veya hiç çalışmaz.
Program çalışırken kaç bayt RAM kaldığını öğrenebilirsin:
1int freeRam() {2extern int __heap_start, *__brkval;3int v;4return (int) &v - (__brkval == 0? (int) &__heap_start: (int) __brkval);5}67void setup() {8Serial.begin(9600);9Serial.print("Boş RAM: ");10Serial.print(freeRam());11Serial.println(" bayt");12}1314void loop() {}Çıktı örneği: Boş RAM: 1234 bayt
Dynamic String'ler RAM'i tüketir:
1// YANLIŞ - RAM'i çok kullanır2String mesaj = "Sıcaklık: " + String(25.5);34// DOĞRU - PROGMEM kullan5const char mesaj[] PROGMEM = "Sıcaklık: 25.5";PROGMEM, verileri Flash belleğinde (4KB) saklar, RAM boşaltır.
1. Global Dizi Boyutunu Küçült:
1// YANLIŞ2char buffer[256];34// DOĞRU5char buffer[32];2. Gereksiz Kütüphane Kullanma:
1// Eğer sadece seri haberleşme yapıyorsan2// Bluetooth veya WiFi kütüphanesi ekleme3#include <SoftwareSerial.h> // Hafif4// #include <WiFi.h> // Ağır - gerekli değilse yorum yap3. Bellek Sızıntısını Kontrol Et:
1void setup() {2Serial.begin(9600);3}45void loop() {6Serial.println(freeRam());7delay(1000);8}Sayı düşüyor mu? Bellek sızıntısı var demektir.
[kod]
const char temp_label[] PROGMEM = "Sicaklik: ";
void setup() {
Serial.begin(9600);
}
void loop() {
int sensor = analogRead(A0);
float sicaklik = sensor * 0.49;
Serial.print(temp_label); // PROGMEM kullan
Serial.println(sicaklik);
delay(1000);
}
[/cod]
- freeRam() ile boş belleği kontrol et
- PROGMEM ile String'leri Flash'a taşı
- Dizi boyutlarını gerekli kadarıyla tut
- Gereksiz kütüphane yükleme
- Bellek sızıntısını düzenli izle
Bu adımlarla Arduino'nun 2KB RAM'ini verimli kullanabilirsin.
5 yorum
2kb ram ile işlem yapmak cidden zor he string kullanmak çılgınca rahat ama hemen bitiriyor belleği flashe koymak iyi çözüm ama başlarda hiç aklıma
ya başta ben de flashi görmezden geliyordum sonra bir proje bitirken program aniden çöküyor ne oldu diye bakıyorsun ramin bitmiş oluyor o zaman
işte abi tam da o an aydınlanıyorsun çünkü hata mesajı falan yok sadece program garip
en kötü tarafı da çöktüğü an neyin yanlış olduğunu anlamıyorsun başta düzinelerce yerden
aynen o yüzden freeRam fonksiyonu yazıp sürekli kontrol etmek gerekiyor loop içinde