2010-10-12 14 views
5

me encontré con esto en hardware integrado usando C.Embedded función C macro problema

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

no tengo ni idea de cómo es esta función macro de trabajo. Entiendo que clkcon es el parámetro de función para EnterPWDN, pero ¿qué está pasando después de eso?

Respuesta

8

que proyecta la dirección 0xc0080e0 a un puntero a funcionar teniendo un int y volviendo void, y pide que la función, pasando clkcon como parámetro.

Explicado:

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

(. Si no ha llegado a través de punteros de función, es posible que desee grab a good C introduction y leer sobre el tema)

5

Es un puntero de función que toma un vacío int como un parámetro. La función se mantiene en la dirección de memoria específica 0xc0080e0.

(void (*)(int)) 

Lo anterior es una declaración de puntero a la función. Primero viene el tipo de devolución de nulo. Luego viene el hecho de que es un puntero y, finalmente, el int le dice cuál es el parámetro de la función. La dirección de memoria es la ubicación en la que está almacenada la función y todo está convirtiendo esa dirección de memoria en el tipo de puntero de función correcto y luego llamando a la función y pasando "clkcon" a ella.

3

excelentes respuestas Goz y sbi, pero para decirlo de otra manera:

en una dirección específica (0xc0080e0) en la memoria, posiblemente en una ROM, hay una función. Llama a esta función con el argumento int clkcon.