Arm7 Nxp 2104 işlemci ile basit bir Uygulama
ARM işlemcisi ( Acorn Risc Machine), Acorn firmasının lisansına sahip, bir RISC (indirgenmiş komut seti) mimarili işlemcidir. Gömülü sistemlerde özellikle cep telefonlarında ve tablet bilgisayarlarda sık olarak kullanılmaktadır. Birçok mikroişlemci üreticisi ARM işlemcisinin çekirdeğini kullanmaktadır.
RISC mimarili işlemciler, CISC ( karmaşık komut seti ) mimarili işlemcilere nazaran çok az sayıda komut setine sahiptir. Örneğin Arm işlemcilerin çekirdeğinde, çarpma işlemini icra edecek bir komut yoktur. Peki bu işlemci çarpma işlemini nasıl icra ediyor? ( cevap : toplama işlemini döngüleyerek. ) Makine dilinden daha yüksek seviyeli dillere geçişte;
Makine dili > Assembly > C > C++ || Java
şeklinde bir geçiş söz konusu. Assembly dili ( asm ) Makine dilinin bir üstünde, makine dilini cover ederek, geliştiricilere daha kolay yazılım geliştirmeyi sağlıyor ( artık ne kadar kolay denirse.. ). Asm dilini mevcut işlemcinin makine diline çevirmek için ise her işlemciye ( bir mikrodenetleyici de olabilir) ait olarak geliştirilen Assembler yazılımlar kullanılıyor.
Her işlemcinin komut seti farklı olduğundan dolayı, geliştirici kullandığı işlemcinin Asssembly sözdizimini bilmek zorunda kalıyor. Buda geliştiriciye her bir aygıt için yeni bir Assembly sözdizimi öğrenmesini şart koşuyor. Bu tip problemlerden ötürü gömülü yazılım geliştiricileri C diline geçmişlerdir. C dili çok güçlü bir dil ve yine C dilinde geliştirilen bir gömülü yazılım, mevcut Compiler (Derleyici)’ ın desteği düzeyinde, Assembly diline veya doğrudan o işlemcinin makine diline dönüşüm sağlayabiliyor. Fakat şunu bilmek gerekirki, dilin seviyesi arttıkça oluşturulan makine kodu uzamakta ve komutları koşturma süresi de buna mütakiben artmaktadır. Bir sonraki basamakta ise bizi C++ dili karşılıyor, bu dilin en büyük avantajı ise Nesneye yönelik programlamaya destek sağlaması.
Aslında C dili gömülü yazılım geliştirmek için fazlasıyla yeterli, fakat gömülü yazılım geliştiricileri neden C++ dilini de kullanıyor dersek (cevap : Büyük projelerde, kolay dökümantasyon avantajı ve kontrol edilebilirlik sağlaması diyebiliriz). Bir üst seviye yada yan seviye olarakta Java dili kabul edilebilir. Fakat şu anda core (çekirdek) seviyede Java dili pek tercih edilmiyor. JVM (Java Sanal Makinesi ) şu anda, genel olarak konak bir işletim sistemi üzerinde koşturulduğu için, gömülü bir işletim sistemi gerek görülmeyen projelerde, Java dilini istesekte kullanamıyoruz. Aslında doğrudan byte kodları donanım seviyesinde yorumlayan işlemcilerin varlığını da bilmek gerekir. Byte kodlar genel olarak donanım seviyesinde koşturulmadığı için, RTOS (Gerçek zamanlı işletim sistemi ) sistemlerinde Java’yı çok sevsekte kullanamıyoruz. Tabi ki zaman kısıtının çok önem arzetmediği projelerde Java’dan faydalanabiliriz. Burada Java dilinin en büyük avantajı byte kodlarını JVM’in doğrudan makine diline dönüştürebilmesidir.
Bu yazımda incelemiş olduğum Arm7 Nxp 2104 işlemci ile basit bir yürüyen ışık göstermek istiyorum. Projede C dilini tercih ettim. Öncelikle devremizi Proteus da şekildeki gibi kuralım. ( Kaynak kodlar kısmından proje dosyalarına erişebilirsiniz. ) Proteus elektronik devrelerin simulasyonu amacıyla en çok tercih edilen yazılımdır.
Port 8-15 arasında renkli ledlerimizden ekliyoruz. V18 girişine 1.8 voltluk bir DC kaynak bağlıyoruz. V3 girişlerinede ismi üzere 3 er Volt uyguluyoruz. Simulasyon kısmımız bu kadar gelelim kod bölümüne. Derleyici olarak Keil Uvision 4 kullandık, ücretli bir derleyici, demo sürümünü deneyebilirsiniz. Kodları anlayabilmek için basit C bilgisi ve Hexadecimal-Binary sayı tabanlarını bilmek yeterli.
Main Code : X.c ;
#include <lpc210x.h>
static int i;
int main (void)
{
//static int leds[] = { 0x0000,0x0100, 0x0200, 0x0400,
0x0800, 0x1000, 0x2000, 0x4000, 0x8000};
static int leds[] = { 0x0300,0x0C00, 0x3000, 0xC000};
IODIR |= 0x0000FF00;
// 32 adet port mevcut ; 0000 0000 0000 0000 1111 1111 0000 0000
// 1' ler > input (giriş) , 0' lar > output (çıkış)
while(1) {
for (i=0;i<4;i++)
{
IOSET|=leds[i];
delay(350000);
}
for (;i>=0;i--)
{
IOCLR|=leds[i];
delay(350000);
}
}
}
int delay(int d)
{
for(; d; --d);
}
Başlangıçta lpc210x.h kütüphanesini projemize ekliyoruz. Bu olmazsa olmazımız değil fakat işlemciye ait tüm adres tanımlamaları burada hazır olarak bir değişkene tanımlanmış. Bu kod örneğimiz ikişer ikişer ledleri yakmakta ardından sona geldiğinde ise ikişer ikişer led’leri söndürmektedir. While(1) deyimiylede bu işlem makine pert olana kadar devam edebilecektir ( sonsuz döngü) . Ledlerimizi ( yani port adreslerini ) leds[] adında bir diziye atadık. IODIR ; lpc210x.h kütüphanemizdeki giriş çıkış adresini referans alıyor. Burada 0x den sonra 8 rakam içermekte her bir rakam 4 biti temsil ediyor en sağdan, yani low bit den başlarsak; İlk 8 bit 0 sonraki 8 bit 1 ve en son geriye kalan 16 bit ise 0 olarak tanımlanmış. Yani sadece 8. bit den 15. bite kadar olanlar aktif edilmiş. IOSET ledlerimize logic 1 uyguluyor, IOCLR ise logic 0, ve her yakıp sönme işleminden sonra 350000 ms bekliyor. Teker teker yanıp sönmesi içinde pasif olan leds tanımlamasını aktif edebiliriz ve tabiki döngülerdeki 4 rakamını 8 yapmalıyız. En sonda C kodlarını bir Hex uzantılı dosyaya derleyip Proteus da tanıtmalıyız. Bu işlemi ise Proteus projesi üzerinde, işlemciye çift tıklayarak yapabiliriz.
Şimdi ise lpc210x.h kütüphanesine göz atalım ;
Bu kütüphane olmazsa olmazımız değil demiştik. Fakat geliştiricilere ayrılmış tüm özel adres tanımlamalarına buradan kolayca erişebilmekteyiz.
Kütüphane dosyasında, entegremize ait birçok adres tanımalamaları mevcut MAM, Watchdog, RealTime Time Clock. Biz ise sadece GPIO ( General Purpose Input Output ) , yani Genel Amaçlı Giriş Çıkış bölümünü kullandık. Entegremizin hangi adreslemeleri kullandığını ise işlemcimizin datasheet‘ in den ayrıntılı olarak erişebiliriz..
Tag:arm, keil, nxp, risc, yürüyen ışık
1 Comment
Doğrusu hazır çalışırda arm projesi bulmak zor, biz öğrenciler için, Gösterdiğiniz ilgi ve alakanız için bir öğrenci olarak çok Teşekkür ederim, Daha başarılı yaşamlar diyelim .