Header dosyasındaki bir tanım hakkında

Başlatan bunalmis, 06 Mayıs 2011, 18:03:52

z

Header dosyasında aşağıdaki gibi bir tanım var.

#define ADR  (*((volatile unsigned short *) 0x12345678))

Bunun ne anlama geldiğini açıklayabilirmisiniz?

Diğer sorum da;

Yukarıdaki tanıma hiç dokunmadan, örnekteki ADR ismini kullanarak, integer tanımlı bir değişkenin  0x12345678 değer almasını nasıl sağlarım?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı yapılan: bunalmis - 06 Mayıs 2011, 18:03:52
Header dosyasında aşağıdaki gibi bir tanım var.

#define ADR  (*((volatile unsigned short *) 0x12345678))

Bunun ne anlama geldiğini açıklayabilirmisiniz?

Diğer sorum da;

Yukarıdaki tanıma hiç dokunmadan, örnekteki ADR ismini kullanarak, integer tanımlı bir değişkenin  0x12345678 değer almasını nasıl sağlarım?
(volatile unsigned short *) 0x12345678  ===> 0x123.. adresindeki registerin  bir short pointer olarak kullanimi

*((volatile unsigned short *) 0x12345678) ===> 0x1234... adresindeki registerin o andaki short int olarak icerigi (sizin mimarinizde short 8, 16, yada 32 bit olabilir, sizeof ile bir kontrol ediniz, buyuk ihtimal short 16bitdir ama yinede yanilmis olabilirim)

#define ADR  (*((volatile unsigned short *) 0x12345678)) ====> 0x123... registerin o andaki short degerine verilen macro ismi (extra parantezler guvenli kullanim icin ADR++ derseniz filan diye ornegin

ADR kullanarak int bir degere 0x123... koyamazsiniz (yada benden daha cingoz biri cikip nasil konuldugunu gosterir  :) valla C iste boyle bir dil, olmaz deme olmaz olmaz!)


Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

#define TMR1_BASE_ADDR      0xE0008000
#define T1PR           (*(volatile unsigned long *)(TMR1_BASE_ADDR + 0x0C))

olduguna gore, T1PR nin tuttugu adresi basitce R0 registerine atmanin bir yolu varmi? (Asm yazimda yolu varmi)





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

z

Yanlis anladiniz,

#define TMR1_BASE_ADDR      0xE0008000
#define T1PR           (*(volatile unsigned long *)(TMR1_BASE_ADDR + 0x0C))

C de tanimlanmis olsun.

void __asm fonk()
{
;           R0 rege (TMR1_BASE_ADDR + 0x0C) degerini yukleyelim
;           Fakat bu is icin C de tanimlanmis T1PR den yararlanalim

}

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

z

#4
Alıntı yapılan: gerbay - 06 Mayıs 2011, 23:33:38
şöyle birşey işinizi görür mü;
#define TMR1_BASE_ADDR      0x10000000
#define T1PR           (*(volatile unsigned long *)(TMR1_BASE_ADDR + 0x0C))

void __asm fonk()
{
;           R0 rege (TMR1_BASE_ADDR + 0x0C) degerini yukleyelim
;           Fakat bu is icin C de tanimlanmis T1PR den yararlanalim
   ldr r0, =TMR1_BASE_ADDR
   ldr r1, =0x89abcdef
   str r1, [r0, #0x0C]
}


int main()
{
  fonk(); 
}


Hocam sorunum;

ARM CM3 cipin registerlerinin sayisi atiyorum 400 tane. Bunlar icin adamlar oturmuslar satir satir asagidaki gibi tanimlama yapmislar.

#define TMR1_BASE_ADDR      0x10000000
#define T1PR           (*(volatile unsigned long *)(TMR1_BASE_ADDR + 0x0C))

C de bu tanimlari kullanarak T1PR=0x10 gibi rahatca kullanabiliyoruz.
Fakat C icinde ASM yazimda T1PR yi kullanamiyorum. (T1PR de pointer tanimi yapilmis olmasi isi bozuyor)

Eger header dosyada

#define T1PR           (*(volatile unsigned long *)(TMR1_BASE_ADDR + 0x0C))

değilde

#define T1PR           (TMR1_BASE_ADDR + 0x0C))

tanimlanmis olsaydi Asm de kolayca kullanabilecektim. Ama ben kullanmayi beceremedim.
Su anda bunun bir yolu varmi ona bakiniyorum.

Yeni bastan header dosya uretmek cok zahmetli. En kotu ihtimalle Delphi vs bir dille header dosyayi okuyup yeni bir dosya uretme yoluna gidecegim.
Fakat ayni header dosyayi kullanmak mumkun olursa boyle bir yola girmeyecegim.





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

controller

Şunu deneyin;

#define ADR  (*((volatile unsigned short *) 0x12345678))

LDR R0,=__cpp((int)&(ADR))
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

z

Keil 7

Gercekten ise yaradi. Tesekkurler.

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

Burak B

"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

#8
#define ADR  (*((volatile unsigned short *) 0x12345678))

seklinde tanimlanan registerin adresini cekmek icin  LDR R0,=__cpp((int)&(ADR)) kullanabiliyoruz.

Fakat bu yazim yerine anlasilir ve guzel gorunum acisindan sahte bir kod uretmek istesek ve Ornegin  Adres(R0,ADR) seklinde yazim tercih etsek.

Bunu nasil gerceklestirebiliriz?

Adres(R1,ADR);  ===  LDR R1,=__cpp((int)&(ADR))

define direktifi ile boyle bir soruna cozum getirebilirmiyiz?

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

z

@Gerbay

Tesekkurler. Sorunlar cozuldukce Keil de C icinde asm fonksiyon yazmak daha da keyifli hale geldi.



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