arduino ve gömülü yazılım

Bir Satır Arduıno Kodunu Derleyerek Neler Öğrenebilirsin ?


Kit fiyatları, öğrenci arkadaşların bütçelerini bir süredir zorluyor. Nispeten Arduino Uno gibi geliştirme kartları çok daha rahat erişilebilir hale gelmiştir. Kimi kesim tarafından oyuncak ya da hobi olarak görülen bu kart ile ilerde gömülü yazılım alanında çalışmayı düşünen arkadaşların güzel temeller atabileceğini göstermek amacıyla bu yazıyı yazıyorum.

void setup() 
{
  Serial.begin(9600);
  Serial.println(RAMEND, HEX);
}

void loop() 
{
   
}

Yukarıda bulunan kodu Arduino IDE’si aracılığıyla derlediğinizde Uno modeli için şöyle bir çıktı muhtemelen sizi IDE’nin derleme alanında karşılayacaktır.

Sketch uses 1570 bytes (4%) of program storage space. Maximum is 32256 bytes.
Global variables use 188 bytes (9%) of dynamic memory, leaving 1860 bytes for local variables. Maximum is 2048 bytes.

Burada bazı rakamlar görüyoruz, bu kartı çoğu zaman hobi amaçlı kullanan kişiler için kodun derlenmesi ve beklediği gibi çalışması elbette çoğu zaman yeterli olacaktır.

Bu rakamların analizi için avr-size isimli bir araç kullanacağım, bu araç Arduino IDE’sini yüklediğinizde arduino-x.y.z/hardware/tools/avr/bin dizini altında bulunmakta. Yukarda bulunan kodun derlenmesi sonrasında oluşan .elf uzantılı dosyayı bu araca veriyorum.

avr-size.exe -A <file.elf>

.data alanı ilklendirilmesi yapılmış global/statik veri tiplerinin değerlerinin tutulduğu bir alan.
.text programın yürütülebilir makine kodlarını içeren bellek bölümü diyebiliriz.
.bss .data alanının aksine ilklendirilmesi yani bir değer atanması yapılmamış değişkenlerin tutulduğu bir bellek alanı.

Ne kadar flash alanı tükettiğinizi .data ve .text alanlarını toplayarak elde etmeniz mümkün. Yukarıda bulunan çıktıya bakarsanız 1570 byte (1548 + 22) bir alanın kullanıldığını görebilirsiniz. Tüketilen RAM miktarını ise .data ve .bss alanlarını toplayarak elde edebiliriz. Çıktımıza göre 188 (166 + 22) byte bir RAM alanını tüketmekteyiz. RAM volatile bir bellek alanı ve bir donanım için run-time durumundayken işlevsel. Farkettiyseniz tüketilen program alanı ve ram alanını hesaplarken .data bölümü ikisi içinde ortak. Data bölümünde tutulan verilen aynı zaman programın saklama alanında bir yere sahipler ve kodun startup rutininde ilgili değerler bu şekilde RAM bölgesine kopyalanıyorlar. Gelin .data, .text, .bss’i daha iyi anlayalım.

char foo [1000];
void setup() 
{
  Serial.begin(9600);
  Serial.println("foo");
  Serial.print (foo);
}

void loop() 
{
}

Yukarda bulunan kod parçası Arduino Uno kartı için şu çıktıyı veriyor.

Sketch uses 1498 bytes (4%) of program storage space. Maximum is 32256 bytes.
Global variables use 1192 bytes (58%) of dynamic memory, leaving 856 bytes for local variables. Maximum is 2048 bytes.

Eğer foo isimli dizinin elemanları için değer ataması yaparsak;

char foo [1000] = { 1, 2, 3, 4, 5 };
void setup() 
{
  Serial.begin(9600);
  Serial.println("foo");
  Serial.print (foo);
}

void loop() 
{ 
}

1000-byte kadar daha fazla flash alanı tüketildiğini söylüyor.

Sketch uses 2498 bytes (7%) of program storage space. Maximum is 32256 bytes.
Global variables use 1192 bytes (58%) of dynamic memory, leaving 856 bytes for local variables. Maximum is 2048 bytes.

Değer ataması yaptığımızda artık .data belleğine taşımış olduğumuzu görebilirsiniz. Atama gerçekleşmediği durumda .bss belleğinde tutuluyordu.

Bir çok kavramı öğrenmek için Arduino’nun iyi bir araç olduğunu düşünüyorum ben açıkcası, eğer farklı düşünüyorsanız konuşabiliriz. 🙂