http://www.picproje.org/index.php/topic,35908.90.html
Pointerler üzerine konuşmaya devam edelim.
Çipinizin dokumanında, adresi atıyorum 0x42345678 olan bir register gördünüz.
Fakat
#include ile programınıza dahil edilmiş olan çipin register
tanımlamalarının bulunduğu dosyada her nedense bu 0x12345678 adresli
register yer almamış.
Sizin de bu registeri kullanmanız gerekiyor. Ne yapacağız?
---------------------------------------------------------------
Programlarda int A yada char A vs bir tanım yaptığınızda, A değişkenin adresi derleme aşamasında C tarafından belirlenir.
Halbuki
registerlerin adreslerini çip üreticisi belirler. Dolayısı ile bu gibi
durumlarda adres belirleme işini derleyicinin inisiyatifinden almamız
gerekir.
---------------------------------------------------------------
Şimdi daha önceki pointer anlatımımızı hatırlayın ve aşağıdaki satırları takip edin.
int A; // Ben integer bir değişkenim
int *P; // Ben integer değişkenin adresini saklayabilirim
P=&A; // Pointer'a A değişkeninin adresini yazdık
*P=0x12; // pointerin gösterdiği int alana 0x12 değerini yani 0x00000012 yükleyeceğiz demektir.
// Yukarıdaki satırlar A=0x12 demekle aynı şeydir.
---------------------------------------------------------
Yukarıdaki
örnekte pointera A değişkeni, hangi adresde ise o atandı ve kullanıldı.
Şimdi yok kardeşim A nın adresini değil benim vereceğim sayısal adresi
kullan diyelim.
Sonrada bu adrese örnek olarak 0x12345678 değerini yazalım.
int *P;
P=(int*) 0x42345678;
*P=0x12345678;
----------------------------------------------------------------
Fakat ben P nin önüne her defasında * koymak istemiyorum.
#define P (*((int*) 0x42345678)) tanımlarsak
P=0x12345678;
yazarız.
Eğer yakışıklı görünmesi şart değil derseniz
(*((int*) 0x42345678))=0x12345678; de yazabilirsiniz.
Verilen örnekler 0x42345678 adresine 0x12345678 sayısını yazar.
----------------------------------------------------------------------------
Yukarıdaki örneklerde pointeri integer tanımladık.
Bir portu, bu şekilde pointer ile kullanmak için portu int tanımlamak sakıncalıdır. unsigned int tanımlanmalıdır. Neden?
Hiç yorum yok:
Yorum Gönder