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?
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!)
#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)
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
}
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.
Şunu deneyin;
#define ADR (*((volatile unsigned short *) 0x12345678))
LDR R0,=__cpp((int)&(ADR))
Keil 7
Gercekten ise yaradi. Tesekkurler.
Daha geniş bir açıklama için;
http://www.keil.com/support/man/docs/armcc/armcc_chdbhjcc.htm (http://www.keil.com/support/man/docs/armcc/armcc_chdbhjcc.htm)
#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☻
@Gerbay
Tesekkurler. Sorunlar cozuldukce Keil de C icinde asm fonksiyon yazmak daha da keyifli hale geldi.