#define Tanimında adres verme mantığı.

Başlatan M_B, 21 Ocak 2017, 10:49:29

M_B

Merhalar

#define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2))
#define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7B8))


((uint16_t*) ((uint32_t) 0x1FFFF7C2)) bu kısmı acıklayabilirmiyiz?

anlamadığım kısım (uint16_t*) ((uint32_t) ??

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yldzelektronik

uint16_t türünde bir bir pointer tanımı yapılmış. Yanlış anlamadı isem
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

M_B

Alıntı yapılan: yldzelektronik - 21 Ocak 2017, 11:56:09
uint16_t türünde bir bir pointer tanımı yapılmış. Yanlış anlamadı isem
((uint32_t) 0x1FFFF7C2))  32 bit olan adres icin neden 16 bitlik bir pointer tanımlansın ki?
Bende mantıgını anlamadım.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

yldzelektronik

#3
Platformun ne olduğunu bilmiyorum.Ama sanırım 32bit adres genişliği olan bir platform.

((uint32_t) 0x1FFFF7C2)


ile 32bit bir sayı olduğunu garantilemiş.

(uint16_t*)
ile uint16_t türünde pointer tanımı yapılmış.

Aslında
uint16_t *p
tanımından farkı yok.

Zaten dikkat ederseniz definetion olarak tanımlanan isimde address yazıyor.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

F493

Selam,

  Bu tanımlama şekline C proğramlama dilinde Macro adı verilir. Siz yazılımın her hangi bir satırında TEMP110_CAL_ADDR bu ifadeyi yazdığınız anda derleyici oraya  ((uint16_t*) ((uint32_t) 0x1FFFF7C2))  bu kodu yapıştırır. Macroların amacı karmaşık ifadeyi yazıp onu basit bir anlamlı isimle ifade etmektir.


  Bu tanımlamanın amacı anladığım kadarıyla ;  kullanıcı  normal şartlarda  0x1FFFF7C2  adresine yazma okuma yaparsa 32 bitlik bir erişim yapmış olur. 

Fakat  #define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2))  bu tanımlama sayesinde ilgili adrese 16bit High ve 16bit Low şeklinde erişebiliyor.

ör,  Low16 = TEMP110_CAL_ADDR ;
      High16 = TEMP110_CAL_ADDR + 1 ;

ya da,  macrosuz biçimiyle,

    Low16 = ((uint16_t*) ((uint32_t) 0x1FFFF7C2));
    High16 = ((uint16_t*) ((uint32_t) 0x1FFFF7C2)) + 1;   
  aynı anlama gelir. Ama macro daha iyi bir yöntemdir.



gibi. Ama emin olmak icin denemek lazım. O adrese bir deger yazın ve bu şekilde erişin sonuçtan anlaşılır.

Esen kalın.

Klein

(uint16_t *) işaretçinin 1uint16_t tipinde olacağını söylüyor.
(uint32_t)sayı  ise sayının 32 bit olarak değerlendirilmesi gerektiğini söylüyor.

32 bit işlemcide  işaretçilerin tipi ne olursa olsun 32 bit. İşaretçiye sabit bir sayı ya da bir değişkenin içeriğini işaret adresi olarak verirseniz bu sayı 32 bit olmak durumunda. Sabit girilen bir sayının kaç bit olacağını derleyici bilemeyeceği için ona bizim bildirmemiz gerekiyor.