2010-10-12 18 views
5

Ben bu fonksiyon makro çalışma nasıl hiçbir fikrim yok Gömülü C işlevi makro sorun

#define EnterPWDN(clkcon) ( (void (*)(int))0xc0080e0) (clkcon) 

C

kullanarak gömülü donanım bu rastladı. Anladığım kadarıyla clkcon, EnterPWDN'nin işlev parametresidir, ancak bundan sonra ne oluyor?

cevap

8

Bir int ve void geri alma işlevi için bir işaretçi adresi 0xc0080e0 yayınları ve parametre olarak clkcon geçen, bu işlevi çağırır.

dışarı Kılçıksız:

typedef void (func_ptr*)(int); 
func_ptr func = (func_ptr)0xc0080e0; 
func(clkcon); 

(. Eğer işlev işaretçileri rastlamadım varsa, grab a good C introduction istiyoruz ve bu konuda yukarı okuyabilir)

5

Onun bir alan bir boşluk fonksiyonu işaretçisi bir parametre olarak int. İşlev, belirli bir bellek adresinde (0xc0080e0) tutulur.

(void (*)(int)) 

Yukarıdaki işlev işaretçisi bildirgesidir. İlk olarak geçersiz dönüş tipi geliyor. Ardından, bir işaretçisinin ve nihayet int'nin işlevin parametresinin ne olduğunu söylemesi gerçeğidir. Hafıza adresi, fonksiyonun kaydedildiği konumdur ve her şey, o bellek adresini doğru fonksiyon gösterici tipine döküyor ve sonra işlevi çağırıyor ve "clkcon" kelimesini geçiriyor.

3

Mükemmel cevaplar Goz ve sbi ama Diğer bir deyişle için: muhtemelen bir ROM içinde, hafızada belirli bir adres (0xc0080e0) At

, bir işlevi yoktur. Bu işlevi int clkcon bağımsız değişkeni ile çağırırsınız.