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}
6
7void setup() {
8Serial.begin(9600);
9Serial.print("Boş RAM: ");
10Serial.print(freeRam());
11Serial.println(" bayt");
12}
13
14void loop() {}

Çıktı örneği: Boş RAM: 1234 bayt

Dynamic String'ler RAM'i tüketir:

1// YANLIŞ - RAM'i çok kullanır
2String mesaj = "Sıcaklık: " + String(25.5);
3
4// DOĞRU - PROGMEM kullan
5const 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];
3
4// DOĞRU
5char buffer[32];

2. Gereksiz Kütüphane Kullanma:

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası
1// Eğer sadece seri haberleşme yapıyorsan
2// Bluetooth veya WiFi kütüphanesi ekleme
3#include <SoftwareSerial.h> // Hafif
4// #include <WiFi.h> // Ağır - gerekli değilse yorum yap

3. Bellek Sızıntısını Kontrol Et:

1void setup() {
2Serial.begin(9600);
3}
4
5void 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz
  • neyseartik

    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

  • adlı kullanıcıya yanıt verdi
    pazartesiyorgunu

    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

  • adlı kullanıcıya yanıt verdi
    neyseartik

    işte abi tam da o an aydınlanıyorsun çünkü hata mesajı falan yok sadece program garip

  • adlı kullanıcıya yanıt verdi
    pazartesiyorgunu

    en kötü tarafı da çöktüğü an neyin yanlış olduğunu anlamıyorsun başta düzinelerce yerden

  • adlı kullanıcıya yanıt verdi
    neyseartik

    aynen o yüzden freeRam fonksiyonu yazıp sürekli kontrol etmek gerekiyor loop içinde