Hafızadaki adrese isim vermek?

Başlatan Bayramsumbul, 15 Haziran 2014, 21:15:19

Bayramsumbul

Pointerleri bilmiyor olmalıyım ki işin içinden çıkamadım.Bir değişken var ve bunun hafızada saklanacağı yeri kendim belirlemek istiyorum.
Isaretci kullanarak yaptığımda;

unsigned char* pointer=0x06;

*pointer=0x8f;

Bu şekilde kullanıyorum. Ama ben her kullanımda başına yıldız koymadan sadece ismi ile kullanmak istiyorum.Asm kullanılarak yapılabilir ama bu işi sadece C ile yapmak mümkün mü?  Yada C yapısı itibariyle buna izin vermiyor mu?
Bir Elektronik Meraklısının Serüveni...

Tesla.25

#1
Adresi siz veremezsiniz. Derleyici ve işletim sistemi beraber bir yer ayırırlar diye biliyorum. Ki zaten, sizin vereceğiniz adresin ne durumda olduğunu siz de bilemezsiniz derleyici de.

Bayramsumbul

Peki bir adrese nasıl isim veririz? Ama belirli bir adres.
Bir Elektronik Meraklısının Serüveni...

Tagli

Derleyiciden, bir değişkeni belirli bir adrese yerleştirmesini talep edebilirsin. Nasıl yapıldığı derleyicinin dokümanlarında yazar.

Bunun haricinde, herhangi bir adresi gösteren pointer elbette ki tanımlanabilir. Ama derleyicinin oraya ne koyduğunu - veya koyacağını -  derleme işleminden önce bilmek mümkün değildir.
Gökçe Tağlıoğlu

Tesla.25

Alıntı yapılan: Bayramsumbul - 15 Haziran 2014, 21:25:47
Peki bir adrese nasıl isim veririz? Ama belirli bir adres.

int *isaretci = &xyz;


"xyz" değişkeninin adresine zaten "isaretci" adını verdik.

Bayramsumbul

Orayı zaten biliyorum ama benim istediğim 0x57 adresine x demek.
Hem böylece x 16 bitlik bir sayı olursa 0x58  adresinden son sekiz bitini okuyabilirim.Gerci saçma bir şey oldu ama.
Yani ax=ah-al gibi...
Bir Elektronik Meraklısının Serüveni...

z

#define reg  (*((volatile unsigned long*) 0x1234))  gibi tanimlarsin.

Burada Reg adinda adresi 0x1234 olan bir yer tanimladik.

Reg=10 dersen 0x1234 adresine 10 yazilir.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Bayramsumbul

@Z benim istediğim şey buydu teşekkür ederim.Tum cevap yazanlara teşekkür ediyorum.
Bir Elektronik Meraklısının Serüveni...

AsHeS

0x1234 adresini derleyicinizin kullanmadığına emin olmanız lazım eğer oraya sizin kullandığınız bir değişkeni koyarsa işler beklediğiniz gibi gitmeyebilir.

interrupter

Peki o adresin serbest olduğunu nasil anlayacağız.  Yada zaten pointer tanımladığımızda derleyici o adresi yazilimciya  mi ayiriyor

AsHeS

#10
Alıntı yapılan: interrupter - 15 Haziran 2014, 23:11:55
Peki o adresin serbest olduğunu nasil anlayacağız.  Yada zaten pointer tanımladığımızda derleyici o adresi yazilimciya  mi ayiriyor
#define reg  (*((volatile unsigned long*) 0x1234))
Pointer'ı başı boş tanımlarsanız işinizi şansa bırakırsınız.
unsigned char *pp_ptr;
*pp_ptr = 3;

dediğinizde uninitialized pointer bugı ile karşı karşıyasınız demektir.
Olması gereken;
unsigned char *pp_ptr;
unsigned char pp;
pp_ptr = &pp;


bu şekilde yaparsanız derleyici sizin için pp'nin içine oturduğu adresi ayırır ve sizin statik olarak kullandığınız hafızalarda buraya birşey atamayacağını garanti eder. Adresin serbest olup olduğunu algılamak için ya hafıza haritasının dağılımını kurcalamanız lazım (bkz. Keil Scatter File ve GCC linker script) ya da MikroC'de elbet bu değişkeni bu adrese oturt komutu bulunmaktadır diye düşünüyorum.

mesaj birleştirme:: 16 Haziran 2014, 00:33:39