Mikroişlemci Yazılım

Bu yazıda gömülü sistemlere ve onları tasarlamaya yarayan SystemC diline kaba bir giriş yapmaya çalıştım. SystemC aslında bir dil değil sadece C++da yazılmış bir nesneye yönelik sınıf kütüphanesidir class library. Amacım, SystemC için Türkiyedeki üniversitelerde ilgi uyandırmak. Yazının kaba olması anlattığım konuları çok fazla basitleştirmeye çalışmaktan kaynaklanmaktadır. Eğer yazdığım konuların içeriğini iyi biliyorsanız benden daha detaylı bilgi isteyebilirsiniz. Teknik İngilizceden anlıyorsanız benim işimi çok fazla kolaylaştırmış olacaksınız.

Gömülü Sistemler

Birçoğumuza mikroişlemciler dendiği zaman aklımıza hemen bilgisayarlar gelir. Sebep tabii ki mikroişlemcilerin bilgisayarların beyni olmasındandır. İlginç olan, bilgisayarlardaki mikroişlemcilerin sayısı şu anda dünyada olan mikroişlemcilerin yüzde 2si kadarını kapsamaktadır. Mikroişlemcilerin geriye kalan yüzde 98inin kullanıldığı yerler, mikroişlemciler dendiğinde aklımıza hiç gelmeyen yerlerde ya da sistemlerde gizlenmişlerdir. Dünyada bir yılda yaklaşık 5 milyar mikroişlemci piyasaya sürülmektedir. Bu sistemlerin bir kısmı fabrikalardaki makinalardadır ama diğer bir kısmı ise burnumuzun dibinde, her gün kullandığımız araçların içerisindedir. Bu araçlardan bazıları: televizyon, buzdolabı, motorlu taşıtlar, cep telefonu, dijital fotoğraf makinası, gelişmiş oyuncaklar, vs.

Saydığımız araçların herbiri kendi başına bir sistem olmasına rağmen, bu araçları birçok sistemin bileşimi olarak da düşünebiliriz. Mesela, bir araba sisteminde motor sistemi, fren sistemi, vs gibi bir çok alt sistem mevcuttur. Her bir alt sistem, kendi içinde daha da küçük sistemlere bölünebilir. Konuya alt sistem açısından bakarsak, her bir sistem daha büyük bir sistemin içerisine yerleştirilmiştir ya da gömülmüştür. Böyle sistemlere "gömülü sistemler" denilmektedir. Mesela, bir arabanın fren sistemi bir gömülü sistemdir çünkü araba sisteminin içine gömülmüştür. Günümüzde gömülü sistemlerden daha akıllı olması gerekenleri mikroişlemciler ile kontrol etme eğilimi çok yaygındır ve büyük bir hızla da yayılmaktadır. Bu eğilimi görmenin en kolay yolu yukarıda da belirttiğimiz gibi mikroişlemcilerin bilgisayar dışında kullanıldığı sistemlere bakmaktır. Bu sistemlerin çoğu gömülü sistemlerdir.

Gömülü sistemlerin mikroişlemci kullananları hem donanım hem de yazılım içerirler. Mikroişlemciler ve onun bağlı olduğu bütün elektrik, elektronik, mekanik, vs. alt sistemler donanımı oluştururlar. Yazılım ise sistemin hafızasında saklanır. Mikroişlemci hafızadan yazılımı okur, ne demek istediğini anlar, ve çalıştırır. Bir gömülü sistemin kullandığı mikroişlemcilerin sayısı genelde bu sistemin karmaşıklığı ya da sahip olduğu alt sistemlerin sayısı ile doğru orantili olarak artar. Gömülü sistemlerin bir tane mikroişlemci kullananları da vardır. Bu gerçek, bu yazıda denmek istenenlere ters düşmediği için, yazının geri kalan kısmında mikroişlemci kelimesini hiç bir anlam farkı gözetmeksizin tekil ve çoğul olarak kullanacağız.

Gömülü sistemlerde kullanılan mikroişlemciler genelde basit olanlardır. Daha doğru bir ifade ile 4-bitlik ya da 8-bitlik olan mikroişlemciler daha yaygındır. Buna rağmem eğilim, gömülü sistemlerin yaptıkları işlerin çokluğundaki ve karmaşıklığındaki artışlara paralel olarak, 16- ve 32-bitlik mikroişlemcilere doğrudur. Bugün, yarı iletken teknolojisindeki ilerlemelere paralel olarak artık gömülü sistemlerin birçoğu tek bir yonga üzerinde inşa edilebilmektedirler. Mikroişlemciler böyle bir yonganın yüzey alanının küçük bir kısmını kapsamaktadırlar. Bu arada, böyle tek bir yonga üzerinde inşa edilen sistemler, "bir yongadaki sistem" system-on-a-chip ya da bu terimin İngilizce kısaltması olan SoC ile anılmaktadırlar.

Gömülü Sistemlerin Tasarımı

Gömülü sistemlerin hem donanım hem de yazılım içermesi, onların tasarımı açısından bir çok zorluklar çıkarmaktadır. Artık donanımı ve yazılımı yapan tasarımcı gruplar bir arada çalışmak zorunda kalmaktadır. Tasarımın her aşamasında bu gruplar arasında görüş alışverişi olmak zorundadır. Böyle olmadığı takdirde, sistemin donanım ve yazılım kısımlarının birbiriyle uyumlu çalışması çok zorlaşmaktadır. Tasarımcı grupların bir arada çalışmasının diğer bir sebebi ise hem donanımın hem de yazılımın artık bir programlama işi haline gelmesindendir. Her iki alan için de programlama dilleri vardır. Donanım için, VHDL yada Verilog adlarıyla anılan "donanım tanımlama dilleri" mevcut. Yazılım için işe, C ve C++ gibi çok kullanılan dillerin yanında diğer bir çok programlama dilleri mevcut. Günümüzde donanımın ve yazılımın ayrı ayrı dillerle tanımlanması giderek bir sorun yaratmaktadır. Bunun nedeni şu senaryoyla anlatılabilir.

Gömülü sistemler aşama aşama tasarlanırlar. İlk aşamada sistemin olabilirlik fizibilite çalışması yapılır. Bunun için sistemin çok detaylı olmayan bir modeli, C/C++ C yada C++ dillerinde yazılır. Bu model program çalıştırılarak sistemin geneli üzerinde olabilirlik çalışması yapılır. Yani sistemin simülasyonu yapılır. Bu çalışma içerisinde sistemin donanım ve yazılım kısımlarının belirlenmesi de vardır. Daha sonra sistemin belirlenen kısımları ilgili donanım ve yazılım mühendislerine verilir. Bu aşamada donanım mühendislerinin işi daha zordur çünkü donanım mühendisleri kendi kısımlarının C/C++da yazılmış halini VHDL yada Verilog dillerine çevirmek zorunda kalırlar. Bu çeviri olmazsa donanımı otomatikman yapacak olan programlar çalışmaz. Bu çeviri anında ne yazık ki sistemin modeline donanım mühendislerinin sebep olacağı hatalar girebilir. İşte bunu önlemek için düşünülen şey, sistemin tasarımında tek bir programlama dili kullanmak. Bunun için yeni bir dil keşfetmenin anlamı yoktur çünkü yeni dil için destek bulunması, yeni dilin öğrenilmesi gibi sorunlar tasarımları yavaşlatacaktir. Bunun yerine var olan bir dili kullanmak daha akıllıca olacaktir. İlk aşamadaki tasarımcılar daha çok C/C++ kullandığı için C/C++i kullanmak en iyisi. Ancak C/C++ dillerinin, donanımın ihtiyaç duyduğu konularda desteği yoktur. Mesela, donanımda bir sayı bitlerden oluşan bir vektör olarak düşünülür ve bu vektörün her bir bitine ulaşmak ihtiyacı vardır. C/C++da ise bir sayı kendi başına bir bütündür ve bitlerine dolaylı olarak ulaşılabilir. C/C++dan vazgeçmeden bu konuları desteklemenin yolu C/C++i değiştirmeden C++in sağladığı yapıları kullanarak donanımın ihtiyaç duyduğu konuları desteklemektir. Bu destek geçen yıl içinde sınıf kütüphaneleriyle class library oldu. Böyle bir kütüphane, donanımın ihtiyaçlarını C++ sınıfları ile sağlamaktadır.

Açık Systemc Girişimi

Bu sınıf kütüphanelerinden en başarılı olani, geçen yıl Synopsys www.synopsys.com adlı bir yazılım şirketinin önderliğinde 50-60 tane büyüklü küçüklü şirketin desteği ile tasarımcıların kullanımına sunuldu. Sunuş, "Açık Systemc Girişimi" Open SystemC İnitiative adıyla oldu. Systemc, sunulan sınıf kütüphanesinin adıdır. Bu girişimin açık olması demek, Systemcnin bedava olması yanında isteyen herkes tarafından desteklenmesi anlamına gelmektedir. Systemcyi www.systemc.org adresinden kolayca elde edebilirsiniz. Systemc şu anda Unix, Window NT, ve HPUX işletim sistemleri üstünde çalışabilmektedir. Kullanılacak derleyiciler ise bu sistemlerde kullanılan standart derleyicilerdir. Mesela, GNUnun C++ derleyicisi g++, Sunin C++ derleyicisi, Microsoftun C++ derleyicisi Visual C++.

Bu Girişimin Bize Yararı

Türkiyede üniversitelerde genelde VHDL ve Verilog öğretilmemektedir. Onlar öğretilse bile bu dillerde yazılan programların derleyicilerine ve simülatörlerine ihtiyaç vardır ki bunlar pahalıdırlar. Bunun yanında gömülü sistemlerin önemi dikkate alınarak, bu dillerin modellediği donanım konularının öğretilmesinde çok yarar vardır. İşte bu amaçla Systemc kullanılabir çünkü Systemcde yazılmış bir programı herhangi bir C++ derleyicisi derleyebilir. Sonuçta elde edilecek çalışabilir program bildiğimiz programlar gibi çalıştırılabilir. Ayrıca Systemc üzerine okul projeleri verilebilir çünkü öğrenciler Systemcnin nasıl yazıldığına bakarak eklemeler ve değişiklikler yapabilirler.