12 Haziran 2015 Cuma

SDCC nedir? Ne iş yapar? Linux (Pardus) üzerinde Kullanımı


Uzun zamandır özgür yazılımlar ve dolayısıyla ücretsiz yazılımlar üzerinde araştırma çalışmalarım devam etmekte. Mikrodenetleyici programlamada bir çok mikrodenetleyici çeşidine taşınmış (port edilmiş) derleyici olan SDCC dikkatimi çekti. Benim bildiğim neredeyse ücretsiz tek mikrodenetleyici derleyicisi. Bu derleyici üzerinde uğraşılması gerektiğini düşünüyorum. Şimdilik arama motorlarında Türkçe kaynak hiç gözükmediğinden ilk kaynak olması amacıyla bu yazıyı kaleme almaya karar verdim. Yaptığım uzun araştırmalar sonucunda PARDUS E-Dergi Eylül 2011 1. sayısında SDCC den bahsedildiğine rastladım. Faydalı olması açısından bu yazıyı alıntılayarak burada yayınlamaya karar verdim. Burada Pardus için anlatınlar ubuntu gibi linux dağıtımlarında da rahatlıkla uygulabilir. Umarım faydalı olur. Ayrıca daha sonraki günlerde birebir çalışır durumda test edilmiş, IDE gerektirmeden terminalde derlenebilen kod örnekleri yapmak niyetindeyim. Allah nasip ederse yine bu blogumda bunları bulabileceksiniz.


Pardus'ta MCU Programlama – SDCC derleyicisi


Öncelikle “MCU Nedir?” sorusuyla başlayalım. MCU(Microcontroller=Mikrodenetleyici),karmaşık mantıksal fonksiyonları tek bir entegrede toplayan bir cihazdır. Genelde, başka bir sistemi yönetmek için kullanılırlar. MCU'nun bir Microprocessor(Mikroİşlemci)'den farkı, CPU'ya ek olarak RAM, I/O(G/Ç), EEPROM, CCP... gibi modülleri de dahili olarak bulundurmasıdır.

MCU'lar nerede kullanılır?

Uzaktan kumandalı araçlar, alarm sistemleri, birçok robot çeşidi, beyaz eşyalar... kısaca aklınıza gelebilecek bir çok elektronik cihazda MCU'lar kullanılır.

Farklı MCU üreticileri mevcut mudur? Hangisini tercih etmeliyim?

Piyasada birçok MCU üreticisi mevcut. Bunların başında Microchip, Atmel, Motorola, Zilog, Philips gelir. Ancak hangi marka ve modeli seçeceğiniz, tamamen size kalmıştır. Bu tercihte dikkat edilmesi gereken nokta, seçilen MCU'nun, kullanılacak proje için yeterli teknik donanıma sahip
olmasıdır. Ancak şunu belirtmem gerekir ki Türkiye'de en çok kullanılan MCU markalarından biri Microchip firmasının üretimini yaptığı PIC'lerdir. Ben de yazıma, daha çok PIC Programlama ile
devam edeceğim.

MCU nasıl programlanır?

MCU'lar, derleyiciler sayesinde birçok dille programlanabilirler. En fazla kullanılan diller Assembly,C ve Basic'tir. Assembly'nin biraz ağır,Basic'in ise biraz “basic” kalması nedeniyle,
MCU programlarken C programlama dilini tercih etmek, birçok geliştiriciye daha mantıklı gelmektedir.

Peki Pardus GNU/Linux altında MCU programlanabilir mi?

Elbette. Pardus/Linux üzerinde de MCU programlayabilirsiniz. Bunun için bazı yazılımlar mevcut. Bunların başlıcaları Code::Blocks, Piklab, KTechlab IDE'leri, gputils ve SDCC.

SDCC

SDCC(Small Device C Compiler) tekrar hedeflenebilir, optimize bir Ansi­C derleyicisidir. Derleyicinin hedefleri (target), Intel 8051, Maxim 80DS390, Zilog Z80, Motorola 68HC08 temelli MCU'lar ile PIC16 ve PIC18 serisi MCU'lardır. SDCC, ücretsiz ve açık kaynak bir yazılımdır. GNU Genel Kamu Lisansı(GPL) altında dağıtılmaktadır. Yani özgürdür.
En önemli özellikleri:

­ Ücretsiz ve açık kaynak olması
­ Kendi içerisinde yazılımınızı hız ve boyut için optimize edebilmesi
­ Birçok MCU'yu desteklemesi.
­ Herhangi bir fonksiyon içerisine Assembly kodu ekleme yeteneği
­ Code::Blocks IDE'si ile entegre olabilmesi
­ Eğer daha önce Hi­Tech C derleyicisi ile PIC programladıysanız, SDCC'nin kodlaması Hi-Tech C derleyicisi ile yüksek oranda benzerlik gösterdiğini görürsünüz.

Kurulum


SDCC için hazırlanmış herhangi bir Pisi paketi bulabilmiş değilim. Ancak kurulumunda da bir zorluk olmadığı için paket aramaya gerek de yok. SDCC'yi kullanabilmeniz için sistemimizde gputils paketinin kurulu olması gerekiyor. Bu paket Pardus Developer deposunda mevcut. Ancak bu depoda, henüz test aşamasına geçecek paketler bulunuyor. Yani son kullanıcılara bu depo tavsiye
edilmiyor. gputils paketini kurduktan sonra, SDCC'nin kurulumuna geçebiliriz.Buradan SDCC'nin son kararlı sürümünü indirelim. Dosya adında i386 yazıyor, ancak Pardus 2011 64 Bit sürümünde de herhangi bir sorun olmadan kuruluyor ve çalışıyor. İndirdiğimiz sıkıştırılmış dosyayı Ev dizinimiz içerisinde sdcc klasörü oluşturup açıyoruz.Konsolu açıyoruz.

$ sudo -i
# cd / home/ kullaniciadiniz / sdcc
# cp -r * / usr/ local


* Not: Pardus, /usr/local dizini kullanmamaktadır. Uygulamayı bu şekilde kurmak, sisteme herhangi bir zarar vermemektedir; ancak Pardus dizin hiyerarşisine uygun değildir. Bunun için, açtığınız SDCC dizini altındaki çalıştırılabilir dosyaları /usr/bin; “sdcc” dizinini ise /usr/share altına kopyalayabilirsiniz. Ancak, yazının ileriki bölümlerinde anlatılan Code::Blocks derleyici yollarını tanımlarken, kopyaladığınız dizinlere göre yaplandırmanız gerekmektedir.

SDCC'yi kopyaladıktan sonra, Code::Blocks'un kurulumuna geçiyoruz. Şu anda Pardus depolarında Code::Blocks IDE henüz mevcut değil. Ancak bu sitede [1] bir pisi paketi mevcut. İndirdiğimiz
paketi kurup, Code::Blocks'u yüklemiş oluyoruz.

Şimdi gelelim Code::Blocks'un SDCC ile entegrasyonuna.
lk olarak Code::Blocks'u başlatın. Menüden Settings­>Compiler and Debugger'e girin:



1. Derleyici olarak SDCC Compiler'ı seçin.
2. Set as Default butonuna basın























3. İkinci işlemden sonra uyarı vermediyse entegrasyon işlemi tamamlanmıştır. Eğer hata veriyorsa dördüncü işlemden devam edin.
4. Toolchain Executables sekmesine gelin ve Yolları (Path) doğrulayın.
5. Search Directories sekmesine gelin ve ­ Compiler alt sekmesine tıklayıp /usr/local/share/sdcc/include/ dizinini ekleyin.

­ SDCC 3.0 ve sonraki sürümler için yine aynı sekmede
/usr/local/share/sdcc/non-free/include/ dizinini ekleyin. Böylece entegrasyon işlemimiz de tamamlanmış oluyor.

Şimdi gelelim ilk uygulamamıza. Hemen menüden; File­>New­>Project'e tıklayın. Gelen pencereden, Empty Project'i seçin. Hemen Next'e tıklayın. Şimdi gelen kısımda projenizin kaydedileceği yolu, projenin adını seçin ve tekrar Next'e basın. Bu kısımda: Compiler olarak SDCC'yi seçin.
Create Debug Configuration seçili olmayacak.
Create Release Configuration seçili olacak.

Ben bu örnek projeyi, PIC16F877A için hazırladım. O yüzden menüden, Project>Build Options'u açalım. Compiler Settings sekmesinin Compiler Flags alt sekmesinde [CPU]Microchip PIC 14 Bit'i seçiyoruz. Daha sonra Other Options alt sekmesine gelip ­p16f877a yazıyoruz. Böylece derleyicimize, projemizi hangi MCU için derleyeceğini anlatmış oluyoruz.

Projemiz için bir main.c dosyası oluşturduktan sonra, projemizin ayrıntılarına gelelim.

16F877A'nın B portunun birinci pinine bir led, 2.pinine ise bir buton bağlı durumda. Amacımız; buton basılı durumdayken ledin yanması, basılı olmadığı durumda ise ledin sönmesi.



Bunun için hemen yazılıma geçiyoruz.



#include "pic/pic16f877.h"
typedef unsigned int config;
// PIC konfigurasyonları yapılıyor.
config at 0x2007 __CONFIG =_RC_OSC & _PWRTE_ON & _BODEN_OFF
& _WDT_OFF & _LVP_OFF;

void main( ) // ana fonksiyonumuz
{
    TRISB2 = 1 ; // B portunun 2.pini dijital giriş olarak ayarlandı.
    TRISB1 = 0 ; // B portunun 1 pini dijital çıkış olarak ayarlandı.
    while(1) // Sonsuz döngüye giriliyor.
   {
        RB1 =RB2 ; // RB1,RB2 'ye eşitleniyor
   }
}


















Yazılımı derlemek için varsayılan olarak Ctrl+F9 tuşu kullanılıyor. Ayrıca menüden Build>Build ile de derleme işlemini gerçekleştirebilirsiniz.

Programımızı da hazırladık ve derledik. Şimdi sıra geldi hazırladığımız programı denemeye. Bunun için iki yöntem mevcut:
1. Bir simülator yazılımıyla(Örn. gpsim) test etmek.
2. Direk olarak yazılımı MCU'muza atarak devre üzerinde test etmek.

Birincisi için gpsim'i kurup kullanmanız gerek. Kurulum paketi Pardus Developer deposunda bulunuyor. Ancak şunu belirtmem gerekiyor, bu depodaki paketler henüz test aşamasında bulunuyor. Kurulumdan sonra tek yapmanız gereken, gpsim'i açıp SDCC tarafından oluşturulan cod dosyasını gpsim tarafından açmak.

İkincisi içinse bir programlayıcı (programmer: Hazırladığımız yazılımı MCU'ya yazmaya yarayan bir devre) lazım. Bu devreler, her MCU marka/modeli için ayrı ayrıdır. Ben Brenner8 tabanlı bir
programlayıcı ve Microchip firmasının üretimini yaptığı PIC'leri kullanıyorum. Programı MCU'muza yazdırmak için bir de masaüstü arayüzü lazım. Sprut firması, Brenner8 için bir GNU/Linux masaüstü arayüzü(GUI) ve sürücüsü hazırlamış. Brenner8 kuıllanıyorsanız / kullanacaksanız bu yazılımları buradan [2] indirip kurabilirsiniz.

SDCC'nin kullanımı hakkında detaylı bilgi almak istiyorsanız, buradan [3] SDCC Manual'i indirip inceleyebilirsiniz.

"SDCC ile PIC programlama hakkında Türkçe bir kaynak var mı?" diye soruyorsanız, hatırlarsınız ki SDCC'nin önemli özellikleri arasında Hi-Tech C derleyicisi ile benzerlik göstermesini belirtmiştim. Dolayısıyla size, Fırat Deveci'nin hazırlamış olduğu Hi-Tech PIC Programlama Kitabı'nı [4] önerebilirim. Kitapta karşılaştığım tek farklılık, kesme (interrupt) fonksiyonlarının tanımlanmasında idi. Onun dışında SDCC ile Hi­Tech C derle­yicileri arasında ,PIC programlarken bir farkarastlamadığımı belirteyim.

SDCC üzerinde kesme fonksiyonlarını aşağıdaki gibi tanımlayabilirsiniz.

void fonksiyonadi( ) __interrupt 0
{
// Kod buraya gelecek.
}

Evet yazımın sonuna yaklaşırken bu yazının bir dergi için hazırladığım ilk yazı olduğunu belirterek, hatalarımın olabileceğini hatırlatayım. Şayet bu yazıda bir hata ya da sorun ile karşılaşırsanız, lütfen info@hckrtech.com eposta adresim aracılığı ile bunu bana bildiriniz.

Bu konuda söyleyebileceklerim şimdilik bu kadar. Hepinize kolay gelsin.

Kaynaklar

http://sdcc.sourceforge.net/
http://wiki.Code::Blocks.org/index.php?title=Using_the_Code::Blocks_IDE_with_SDCC_on_PIC_MCUs

Ek Bağlantılar

PIC16F serisi için bazı include dosyaları mevcut.(Çok kullanılan Delay fonksiyonu için bu siteyi http://burningsmell.org/pic16f628/ inceleyebilirsiniz.) gpsim(PIC MCU'lar için simülatör) projesinin sitesi http://gpsim.sourceforge.net/

[1] http://code.google.com/p/siklon/downloads/list
[2] http://sprut.de/electronic/soft/usburn/linux/usburn_linux.htm
[3] http://sdcc.sourceforge.net/doc/sdccman.pdf


Not: 

Burada verilen örnek kodlar derleme ayarlarının tam yapılamamasından dolayı çalıştırmakta sıkıntı yaşayabilirsin. Ancak dert etmeyin. Şimdilik yazıyı bilgi amaçlı olarak okuyun. Sonra nasıl yapılabileceği konusunda çalışmalar yapılacaktır.

Bu yazı Pardus Eylül 2011 Sayı 1 dergisinin yazısının bir alıntısıdır. Yazı ile igili tüm haklar yazı sahibi kuruluşa aittir. Bu sitede sadece alıntı kaynak gösterilerek yasal çerçevede yapılmıştır.


duralikiraz.blogspot.com
12 Haziran 2015

2 yorum:

  1. Merhabalar,

    Kitaba aşağıdaki linkten ulaşabilirsiniz.

    http://firatdeveci.com/programlar-kitaplar/kitaplar/

    YanıtlaSil