2010-10-12 5 views
5

Je suis tombé sur ce matériel embarqué en utilisant C.fonction Embedded C problème macro

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

Je ne sais pas comment cette fonction de travail macro. Je comprends clkcon est le paramètre de la fonction EnterPWDN, mais que se passe-t-il après?

Répondre

8

Il envoie l'adresse 0xc0080e0 à un pointeur de fonction prenant un int et renvoyant void, et appelle cette fonction, en passant clkcon comme paramètre.

Éliminées:

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

(. Si vous n'êtes pas venu à travers des pointeurs de fonction, vous pouvez grab a good C introduction et lire sur le sujet)

5

Son un pointeur de fonction vide qui prend une int en tant que paramètre. La fonction est maintenue à l'adresse mémoire spécifique 0xc0080e0.

(void (*)(int)) 

Ce qui précède est une déclaration de pointeur de fonction. D'abord vient le type de retour vide. Vient ensuite le fait que c'est un pointeur et finalement l'int vous indique quel est le paramètre de la fonction. L'adresse de la mémoire est l'emplacement où la fonction est stockée et le tout est en train de convertir cette adresse dans le type de pointeur de fonction correct, puis d'appeler la fonction et de lui passer "clkcon".

3

réponses excellentes Goz et sbi, mais pour le mettre une autre façon:

à une adresse spécifique (0xc0080e0) en mémoire, peut-être dans une mémoire morte, il y a une fonction. Vous appelez cette fonction avec l'argument int clkcon.