AVR Assembly -2- AVR Hafıza Birimleri

AVR Assembly derslerimize kaldığımız yerden devam ediyoruz. Önceki dersimizde AVR Assembly programlamanın oldukça kolay ve anlaşılır olduğundan bahsetmiştik. Aslında bu kolaylık ve anlaşılırlık ancak donanım üzerinde bilgi sahibi olmakla mümkün olmaktadır. Eğer donanımdan bihaber Assembly programlamaya çalışırsak neredeyse hiçbir şey anlamamız mümkün değildir. Sırf Assembly değil donanım bilgisi olmadan C ile de programlamak mümkün değildir. O yüzden gömülü sistemlere sırf yazılım yönünden yaklaşmamak ve donanım bilgisini de edinmek gereklidir. Bu donanım bilgisine yönelik Atmel AVR mimarisi ve C ile AVR progaramlama derslerimiz olduğu gibi şimdi de o derslerde bahsetmediğimiz birkaç meseleyi ele alacağız. Bunlardan başlıcası AVR’nin hafıza birimleridir.

Program Hafızası 

AVR’nin Harvard mimarisinde olduğunu ve Flash ROM cinsinde program hafızası ve SRAM cinsinde veri hafızası bulunduğunu söylemiştik. Flash program hafızası Flash yapısında olduğu gibi sayfalara ayrılmıştır. EEPROM’da bayt bayt ele aldığımız hafıza birimleri burada 16K x 16 olarak sayfalara ayrılmıştır. Yazılım güvenliği açısından ise Boot Loader (Önyükleyici) bölümü ve Application (Uygulama) bölümü olarak ikiye ayrılmıştır.

Ayrıca program hafızasına sabit değerleri de yazmamız mümkündür. Örneğin bir açılış mesajını veya hata mesajını ya da yardım sayfasını buraya uzun uzun yazabiliriz. Ram bellekte yeterli yer olmadığı için doğrudan buradan okunup kullanılabilir. C dilinde bu PROGMEM değeri ile kullanılsa da Assembly’de Load Program Memory (LPM) komutu ile kullanılır.

Veri (Data) Hafızası 

AVR’nin SRAM hafızası üç ana bölüme ayrılmıştır. Öncelikli olarak CPU’nun kullandığı genel maksatlı yazmaçlar ile giriş ve çıkış yazmaçları bu hafızada yer alır. Bu bölümler arasında ciddi bir ayrılık söz konusudur ve her bir bölüm için farklı komut kullanmamız gerekebilir. Bu farklı komutların olması performans konusunda bizim yararımızadır. Dikkat etmemiz gereken noktalardan biri ise bir işlem yapmadan önce öncelikle verinin SRAM kısmından alınıp yazmaç kısmına aktarılması gereklidir. Yani mikroişlemci yazmaçlar üzerinde işlem yaparken diğer kısımda okuma ve yazma yapar. Verinin üzerinde aracı olmadan doğrudan işlem yapmak mümkün değildir. Her defasında RAM adresinden bir veriyi yazmaca alıp sonrasında yazmaçlar üzerinde işlem yapıp tekrar adrese kaydetmemiz gerekir.

ALU’da yaptığımız işlemler böyle olsa da okuma ve yazma komutları hem yazmaçlara hem de veriye erişebilir. Yalnız yazmaçlar için özel komutlar vardır bunları ancak yazmaçlarla beraber kullanabiliriz. AVR veri hafızası biriminin yapısı şu şekildedir.

Burada üç ayrı veri türü olduğunu görebilirsiniz. Ext I/O yazmaçları ihtiyaca göre artırılmış giriş ve çıkış yazmacı olduğu için ayrı bir kategoride ele almaya gerek yoktur.

GPR – Genel Maksatlı Yazmaçlar

İngilizce karşılığı “General Purpose Registers” olan bu yazmaçlar doğrudan ALU’nun erişiminde olan ve üzerinde işlenecek verilerin tutulduğu yazmaçlardır. Toplamda 32 adet 8 bit yazmaçtan oluşsa da X, Y ve Z olmak üzere 16-bitlik yazmaçlar da bulunmaktadır. Bunlar gerçekten 16-bit olmayıp alt bayt ve üst bayt olmak üzere iki adet 8-bit yazmaçtan meydana gelir.

Burada toplama, çıkarma, AND, OR gibi işlemleri yaptığımız verileri alıp tekrar veri hafızasına (SRAM) kaydederiz. Yanı burası bizim çalışma alanımız, SRAM ise yaptığımız işi koyduğumuz raflardır. Bu yazmaçlar üzerinde yapılan işlemlerin çoğu tek çevirimde yürütülür. Bu yüzden mikroişlemcinin doğrudan erişiminin olduğu ve işlerin hemen yapıldığı bu yazmaçlara o an yapılacak ve bir an önce yapılması gereken işlerin verileri koyulur. ALU normalde en fazla iki yazmaç üzerinden işlem yapıp tek sonuç verse de rahatça iş yapabilmemiz için 32 genel kullanım yazmacı bize verilmiştir.

Giriş ve Çıkış Yazmaçları (I/O Registers) ya da Özel Fonksiyon Yazmaçları (SFR / Special Function Registers)

Giriş ve çıkış yazmaçlarını C ile AVR programlama dersimizin başından sonuna kadar anlatmış ve onlar üzerinde işlem yapmıştık. Giriş ve çıkış yazmaçları çevre birimleri ve dış dünyaya ait verileri üzerinde bulunduran yazmaçlardır. ADC, USART, SPI, I2C, Zamanlayıcı, PORT gibi birimlerin yazmaçları giriş ve çıkış yazmaçlarıdır. Giriş ve çıkış yazmaçlarına özel okuma ve yazma komutları mevcuttur. IN ve OUT olarak adlandırılan bu komutlar diğer hafıza birimlerinde kullanılamaz. Böylelikle daha performanslı okuma ve yazma işlemi yapılır. Giriş ve çıkış yazmaçları Atmega328P’de uzun bir listeye sahip olduğundan PINB, DDRB, PORTB, PINC, DDRC, PORTC gibi yazmaçları örnek vermemiz yeterli olacaktır.

SRAM

Bu bizim bildiğimiz değişken adreslerinin bulunduğu RAM bellektir. Burada veri okuma ve yazma işlemlerini yaparız. Örneğin C dilinde i = 10 dediğimizde RAM’de i diye adlandırılan adrese 10 değeri yüklenir. Ama Assembly programlamada adres değerleri de önemli olmaktadır.

İlerleyen zamanlarda yeni derslerimiz gelecektir. Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

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.