Linux Çekirdek (Kernel) Derleme

Bu yazı Mesih Veysi Kılınç kardeşimin (Hocamın) GTÜ’de bizi kırmayıp, vakit ayırıp, verdiği “Çekirdek Derleme” eğitiminden aldığım notların sistematik bir derlemesidir.

Gömülü sistem, linux tariflerini yapmadan. Neden Linux, Neden işletim sistemi sorularına cevap vermeden hemen işe koyulalım ve toolchain diyerek başlayalım.

Toolchain Yükleme,  11.02.19

Toolchain Araç zinciri bize hedef sistem için kod derlememizi sağlayan bir derleyici. Fakat bu derleyiciyi hedef sistemde değilde Host (kendi bilgisayarımızda) çalıştıracağımız için bunun bir adıda cross compailer oluyor.

Toolchain indirilebilecek siteler:

  • https://www.linaro.org/
  • https://toolchains.bootlin.com/

Toolchain nasıl bulunur ?

Toolchain için elinizde bulunan boardın işlemci modeli ni öğrenin (örn: ARM Cortex A7 ) : https://en.wikipedia.org/wiki/ARM_architecture#Cores sitesinden Mimariyi bulunuz (Örnek sonucu: ARMv7-A) sonra ise web sayfasından o mimariyi seçin.

m, eabi, abi, hf gibi ekler anlam ifade ediyor. Eğer seçenekleriniz var ise ayrıntılı öğrenmekte fayda var.

Derlemeyi yapacağımız bir ana klasör oluşturalım ve içine toolchain isimli bir klasördaha oluşturalım.

mkdir /opt/cekirdegim
chmod 777 /opt/cekirdegim
mkdir /opt/cekirdegim/toolchain

Şimdide toolchaini indirelim :
cd /opt/cekirdegim
wget https://toolchains.bootlin.com/downloads/releases/toolchains/armv7-eabihf/tarballs/armv7-eabihf–glibc–stable-2018.11-1.tar.bz2

Ve zipten çıkaralım.
tar -xjf armv7-eabihf–glibc–stable-2018.11-1.tar.bz2

Derleyiciyi PATH e ekleyim ki gcc çağrısını yapabiliyor olalım
PATH=/opt/cekirdegim/toolchain/armv7-eabihf–glibc–stable-2018.11-1/bin:$PATH

derlemek için git ile u-boot reposunu indirelim:

git clone https://github.com/u-boot/u-boot.git -b v2019.01 –depth 1

v2019.01 : branch tag name, yani o branchi indiriyor.
–depth sayesinde sadece o commiti indirmiş tüm ağacı indirmemiş oluyoruz.

executablenin hangi sistem için derlendiğini görebilirsiniz.

Uboot Derleme

Devam edeeceğiz

Mikro Denetleyiciler (16F877A)

Bir mikro denetleyici (PİC, MCU veya µC), aşağıda sayılan bileşenlerle tek bir tümleşik devre üzerinde üretilmiş malzemeye denir.

  1. Mikroişlemci
  2. Merkezi işlem birimi(MİB)
  3. Hafıza
  4. kristalOsilatör
  5. zamanlayıcılar (timers)
  6. seri ve analog giriş çıkışlar
  7. programlanabilir hafıza (NOR Flash, OTP ROM).
microcontrolador-pic-16f877a

Bir bilgisayar mühendisinin yazdığı kodları bilgisayar dışında daha somut bir platformda görmek ister diye düşünüyorum. Sizde böyle düşünüyorsanız bunun kolay yolu bir Mikrodenetleyici (PİC) ile çalışmaktır. Tabi bu iş kolay olduğu kadar öğrenci için ucuz bir iş değil ne yazık ki. Fakat bir 100 tl bütçe ayırarak temel malzemeleri elde edebilirisiniz.

İlk projemde Kullanılan malzemeler ve fiyatları:

Malzeme adı ve adet Fiyatı
1 Adet 16f877A Mikro denetleyici 8,00tl
1 adet 10kohm‘luk direnç 0,10tl
2 adet 220ohm‘luk direnç 0,20tl
3 adet led 0,30tl
1 adet 4kmhz lik kristal 1,00tl
1 er metre kırmızı mavi kablo 1,00tl *emin değilim
2 adet 22 pfarad kondansatör 0,50tl
1 adet usb uzatma kablosu 1,00tl
1 adet Küçük Buzzer 1,00tl
ARA TOPLAM 13,10TL
1 adet PIC programlayıcı(Pickit 2) 85,00tl
TOLAM 98,10TL

Yukarıda da görüldüğü gibi aslında çok maliyetli olmayan bir uğraş fakat bir seferliğine bir adet PİC-Programlayıcı almanız gerekiyor. Hatrı sayılır bu parayı vermezseniz benim gibi 3 ay boyunca evde devre kurmaya uğraşır durursunuz. Şevkiniz kırılmaz ise bu uğraşlar insana tecrübe ve elektronik bilgisi katıyor o bir gerçek.

Bu konudaki tavsiyem meslek lisesinde veya üniversitede iseniz hocalarınızdan veya okuldan temin etmeniz ya da konu ile ilgili bir ödünç tanıdıktan almanız.

Kodumuzu Yazalım

Bunun için bir IDE(Entegre Geliştirme Ortamı) ‘ye ihtiyacımız var. Ben ilk uygulamamda Micro C-IDE sini kullandım. IDE’ler arasında farklılıklar var o yüzden hangisine karar
verdiyseniz o IDE ile yazılmış kodlara bakmanız yoksa ilk başta kafanız çokça karışır. Aslında mantık aynıdır fakat ifade tarzı (syntax) farklı olduğu için kavramak zor olur.

Kodumuzu görelim ve açıklamaya devam edelim.
Micro C programını kurup çalıştırıyoruz.
File->New->NewProject diyoruz.
Açılan Wizard dan Proje ismi, kaydedilecek yer, Micro işlemcinin Adı(16F877A) ve Kristal hızını (4.000000mhz) seçiyoruz. Diğer ayarlara şuan bakmadan Finish’i görene kadar next diyoruz.
Editör sayfamızda aşağıdaki kod bloğu karşımıza geliyor

void main() {
}

Açılan Pencereye aşağıda gördüğümüz kodu yazıyoruz

void main ()
{
trisb=0; // trisX=0; ile o porta ait 8 bacağı çıkış olarak ayarlıyoruz.
trisc=0;

portb=0b11111111; // portX= 0b11111111 ile çıkış bacaklarınapotansiyel (volt) gönderiyoruz.
portc=0b11111111;

while(1)
{
portb= 0b11111111;
portc.rc7=0;
delay_ms(200);
portb= 0b00000000;
portc.rc7=1;
delay_ms(200);
}

}

Burada ikili (binary) sayı sistemini kullanıyoruz. Bu yüzden değerirn başında “0b” bulunuyor ve bu sayının binary olduğunu ifade ediyor.Ondan sonra gelen 8 rakam sırası ile port bacakların potansiyel (volt) değerlerini belirliyor. Bu değerler digital çıkışta 0 için 0-Volt iken 1 için (-5)-Volt oluyor.

portb=0b11111111; değeri ile bportınun 0 dan 7(dahil) ye kadar olan 8 bacağının (-5)-Volt çıkış vermesini sağlıyor. Aynı işlemi portc içinde tekrarlıyoruz.

Programın sürekli çalışması için Sonsuz döngü [ while(1) ] içine alıyoruz ve içeride yapılacak işlemleri döngü parantezleri [  { kodlar  }  ] içerisinde sırayla tanımlıyoruz.

Döngü kod bloğumuz sırayla

  1. Portb’nin tüm bacaklarını (-5)-Volt
  2. Portc’nin 7. Bacağını 0- volt yapıyor ve
  3. 200 ms yani 0,2 saniye bekliyor (10–3milisaniye =1saniye)
  4. port b nin tüm bacaklarını 0-volt
  5. Portc’nin 7. Bacağını (-5)-Volt yapıyor ve
  6. delay_ms(ms cinsinden değer) fonksiyonu çağırılarak 0,2 saniye bekletiliyor
  • Bu işlem den sonra döngü başına gidilip tüm işlmeler elektrik kesilene kadar devam ediyor.

Kodumuzu yazdık, derlemeden önce kullancağımız kristalle ilgili ayarı yapmamız gerekiyor. Bunu için

Project->Edit Project e tıklıyoruz ve açılan pencerede PİC Türümüzün seçili olduğunu görüyoruz(16F877A). Aşşağıdaki ayarları sırası ile yapıyoruz.

edit project

  1. Oscillator Selection: seceneğinden XT Oscillatör’ü seçiyoruz
    • XT : Dışarıdan takılan kristalde kullanılıyor.
    • HS: PİC in dahili kristali var ise onu kullanmak için seçilebilir. (16F877A dahili kristale sahip değil)
  2. Kristal frekansımızı başta seçtik kontrol edebilirz ben 4.000000 mhz lik kristal kullandım.

Ve kodumuzu Mikro işlemcinin anlayacağı dile çeviriyoruz(derliyoruz). Derleme işlemini Ana menüdeki (Build->Build) tuşlarına basarak gerçekleştiriyoruz. “Finished successfully “ yazısını altta bulunan Message Penceresinde gördüğümüzde kodumuz sorunsuz derlenmiş ve ihtiyacımız olan (PİC imizin anlayacağı kod) <projeadı>.hex uzantısı ile oluşuyor.

Kodu Bilgisayar ortamında deneyelim(Proteus):

Proteus Programını bilmiyorsanız bu bölümü geçiniz. Ama bu işle uğraşacaksanız öğrenmenizi tavsiye ederim.

Bu kodun çalışmasını bilgisayar ortamında denemek için devre çizme araçlarından biri olan proteus’ta gerçekleyelim.

devre

Proteusu kuruyoruz ve devremizi proteus-isis arayüzünde oluşturuyoruz. Ve PİC’in üzerine 2 kez tıklayarak Program file : kısmına .hex uzantılı dosyanın konumunu gösteriyoruz.

Devrenin simülasyonunu görmek için sol alt taki başlat butıonuna basıyoruz ve her şey yolunda ise ışıkların yanıp sönmesini görebiliyoruz.

Devre Kurulumu

Biraz elektronik bilgisi birazda araştırma ruhu varsa iş yürüyor. Azmin elinden kurtulacak bir şey yoktur.

ordd

Önce resmi görelim ve sonra resim üzerinden konuşalım. Buradan daha açık gözüktüğünden dolayı proteus devreside gözden geçirilebilir.

Pic

Not: PİC de bacaklar 1. Bacak PİC üzerinde girinti şeklindeki nokta ile belirilmiştir ve u şeklinde 1 den 40 a kadar gider (16F877A da 40 bacak var).

Burada önemli olan şu ki 1. Bacak reset bacağıdır ve 0-volt verildiğinde PİC’i durdurur (resetler). Ortamdaki koşullardan etkilenmemesi içi o bacağa 5- volt bağlanması gerekir. Burada potansiyel direnç üzerinden geçirilir ki bu şekilde PİC’inistenilen potansiyeli alması fakat fazla akıma maruz kalmaması sağlanır.

Hangi paçanın hangi bacağa bağlanacağı Proteus çıktısında bacak numaralarıyla gösterilmiştir.

Devreyi kuralım ve bir adet usb kablosu ile 5 voltluk gerilimi borda verelim. Enerji kaynağı olarak hem bilgisayardan hemde bir pirizden yararlanabilmek için Bir usb uzatma kablosunun Dişi kısmını keserek Kırmızı(5 volt) olan kabloyu  + volta, siyah (0 volt) kabloyu ise  – volta(torak-ground) yani toprağa bağlıyoruz.

Kablonun görüntüsü :kablo

Programı PİC’e atmak.

Bu işlem için Yukarıda bahsettiğimiz PİC programlayıcıya ihtiyacımız var. Bu konuda farklı markaların farklı ürünleri var. Biz PİCkit 2 programlayıcısını kullanacağız.

Programlayıcının CD sinden veya web sitesinden indirdiğimiz Programı bilgisayarımıza kuruyoruz. PİCkit2 cihazını usb üzerinden bilgisayarımıza bağlıyoruz. Programı başlatıyoruz. Ve karşımıza gelen ekranda PİC in algılandığını ,ismini , ve yazmaya yazır olunduğu bilgilerini göreceğiz. Program üzerinde Vdd PİCkit2 kısmındaki volt değeri Otomatik ayarlanmadı ise volt değerini 5 Volt a ayarlıyoruz.

pickit pro2

Bu işlemlerden sonra: “File->İmportHex”  i seçerek hex uzantılı dosyanın konumunu programımıza gösteriyoruz. Konum gösterme işlemi bittiğinde(Tamama Tıkladığımızda ) ,Program memory kısmında hez kodunun 16 sayı sisteminde gösterildiğini göreceksiniz.

PİC bilgileri doğru ve yıkarıda bahsedilen ayarlar yapıldı ise Write butonuna tıklayarak Kodun PİC’ e aktarılmasını sağlıyoruz .

pickit 2

PİCkit2 den PİC’i söküyoruz ve devrede yerine takıyoruz. ( Bu işlemler sırasında PİC’in yanmaması için devreye elektrik vermemiş olmamız gerekiyor) .

PİC imizi devreye takıp Usb den aldığımız 5 voltu devreye veriyoruz ve devrenin çalıştığını gözlemliyoruz.

Linkler

PİC Programlayıcı :http://www.delab.net/PICKit2-Programmer,PR-1.html

PİC Programlayıcı Resmi sitesi : http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en023805&redirects=pickit2

Direnç skalası : http://www.biltek.tubitak.gov.tr/gelisim/belektronik/resistor.html