Arduino Kaynak Kodu İncelemesi -2- Wiring_private.h ve Wiring.c Dosyaları

Arduino’nun açık kaynak olduğu ve geliştiricilerin her zaman kaynak kodunu okuyabileceği ifade edilir. Şu bir gerçek ki Arduino öğrenmekle bu kaynak kodlarını anlamanız mümkün değildir. C dilini ve AVR programlamayı öğrenmeniz gereklidir. Bunları bilen birisinin ise hala Arduino kullanması pek beklenemez. Burada bir çıkmaz meydana gelmektedir. C ve AVR bilen insanların kaynak kodlarını kullanarak değil genellikle C dilini ve AVR komutlarını kullanarak Arduino için kütüphane yazdığını görüyoruz. Yani bu platformda kütüphaneleri anlamak için başka bir platformda çalışmanız gerektiği gibi kütüphane yazmak için de yine başka bir platformu bilmeniz gereklidir. Arduino’ya Arduino kütüphanelerini kullanarak kütüphane yazmak pek sağlıklı bir iş değildir. Zaten performans ve kararlılık konusunda sıkıntılı olan bir platformda bir de bu kodlar üzerine kütüphane yazmak işi iyice çıkmaza götürebilir. Yine de bazı kütüphaneleri Arduino komutlarını kullanarak yazmak mümkündür.

Önceki yazıda Wiring.h dosyasını inceleyerek tanımlara bir göz atmıştık. Şimdi ise .h dosyasının devamı olan .c dosyasını inceleyerek yazımıza devam ediyoruz. Ayrıca bu dosyaların #include ile çağırdığı dosyalara da yer vermemiz gereklidir. Çünkü anlaşılmadık bir yerin kalmamasını ve yüzeysel bir inceleme yapmamayı hedefliyoruz. Şimdi incelemeniz için wiring.c kütüphane dosyasının tamamını verelim ve devamında her zaman olduğu gibi satır satır kodları açıklayalım.

Burada ilk koda baktığımızda wiring_private.h adında bir dosyanın eklendiğini görüyoruz. Bu dosyayı gözden kaçırmamak için öncelikle incelememiz gereklidir. Sonrasında ise wiring.c dosyasına geri dönüp incelemeye devam edeceğiz. wiring_private.h dosyasının kaynak kodu şu şekildedir.

Burada bazı kütüphane dosyalarının daha çağrıldığını görüyoruz. Bu dosyalar şu şekildedir.

Bu kaynak kodları incelemenin asıl zorluğu zaten bu dosyalar arasında bağlantıyı kurabilmekti. Şimdi wiring.c dosyasının çağırdığı wiring_private.h dosyasında yine bir sürü kütüphane dosyasının çağrıldığını görüyoruz. Burada bize tanıdık gelen bazı dosyalar mevcuttur. Öncelikle wiring.h dosyasını incelememizin faydasını burada görüyoruz. Burada wiring.h dosyası kullanıldığı için bu dosya hakkında bilgiyi önceki yazıdan edinebilirsiniz. Ayrıca avr/io.h, avr/interrupt.h ve avr/delay.h dosyalarını C ile AVR programlama derslerimizde anlatmıştık. O yüzden bunları anlama konusunda bir sıkıntımız yok. avr/interrupt.h dosyasını kesmeler için kullanırken avr/delay.h dosyasını ise bekleme komutları için kullanıyorduk.

Burada ilk defa karşımıza çıkan iki adet kütüphane yer alıyor. Bunlardan biri stdio.h dosyası diğeri ise stdarg.h dosyasıdır. stdio.h dosyası C dilini bilenler için yabancı gelmeyecektir. Standart giriş ve çıkış fonksiyonlarını kullanmak için bu dosyayı kullanıyorduk. stdarg.h dosyası ise pek tanıdık olacağınız bir dosya olmayabilir.

stdarg dosyası özet olarak C programlama dilinin standart kütüphanesinde yer alan bir kütüphane dosyası olup fonksiyonların sınırsız sayıda argüman alabilmesini sağlatır. Variadic fonksiyon adı verilen fonksiyonları şu şekilde tanımlamamız mümkündür.

Bu C dilini ilgilendiren bir konu olduğu için bu kadarını anlatmakla yetinelim.

Bu kütüphane dosyasının çağırdığı başlık dosyalarını gördük. Şimdi ise tanımlamalara geçiyoruz.

Burada sbi() ve cbi() makroları tanımlanmadıysa tanımlamayı sağlayan bir yapı var. AVR Assembly dilindeki sbi ve cbi komutları ile AVR-GCC’deki komutları birbirine karıştırmamak gerektiği buradan anlaşılıyor. Çünkü C dilinde sbi)() ve cbi() fonksiyonları çok farklı bir şekilde çalışıyor. Öncelikle örneğin PORTD adında bir değişken kullanıyorsak bu değişkenin adres değeri _SFR_BYTE() fonksiyonu ile bulunuyor ve sonrasında _BV makrosu ve bitwise operatörleri ile bu bit bir (1) veya sıfır (0) yapılıyor. Bu AVR konusu olduğu için AVR derslerinde bunun hakkında daha ayrıntılı bilgiye ulaşmanız mümkündür. Önceki derste yine aynı konuya değindiğimiz için tekrarlamaktan kaçınıyoruz.

Burada harici kesmelerle ilgili tanımlamalar yapılmış olup ayrı bir karar yapısında ek tanımlamalar yapılmıştır. Arduino donanım için yazılan bir kütüphane olduğu için taşınabilirliği oldukça düşüktür. O yüzden her donanıma uyumlu hale getirmek için kodların arasına böyle ek kodlar sokuşturulur. Bu ilerlediği zaman okunabilirliği olumsuz etkileyen bir durum haline gelmektedir. Biz de bundan kaçınmak için eski sürümü incelemeyi tercih ettik. Yeni sürümü bir göz gezdirdiğimde bu #if defined yapılarının iyice arttığını ve iyice kod yığını haline geldiğini gördüm. O yüzden kod incelememizde bu #if defined yapılarını atlamamız gerekebilir.

Bu komut voidFuncPtr işaretçisini void’e atamaya yarar. Burada fonksiyon argüman almıyor ve void’i geri döndürmektedir.

Buraya kadar wiring_private.h dosyasını incelemeyi tamamladık. Şimdi wiring.c dosyasını incelemeye devam edebiliriz. Fakat bu dosya aşırı derecede uzun olduğu için açıklamaları bir sonraki yazıya almak durumundayım. Bir sonraki yazıda wiring.c dosyasını açıklamaya devam edeceğiz.

Kapak Resmi, https://images5.alphacoders.com/695/695933.jpg

UYARI!!

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.