2011-09-15 16 views
5

No he escrito el código C++ en mucho tiempo; sin embargo, ahora tengo que trabajar en un DSP con instrumentos F28335 de Texas y estoy intentando migrar de C a C++. Tengo el siguiente código que está tratando de inicializar una rutina de servicio de interrupción con un método estático de una clase:Puntero de conversión C++ al método estático

//type definition for the interrupt service routine 
typedef interrupt void (*PINT)(void); 
//EPWMManager.h 
class EPWMManager 
{ 
public: 
    EPWMManager();  
    static interrupt void Epwm1InterruptHandler(void); 
}; 
//EPWMManager.cpp 
interrupt void EPWMManager::Epwm1InterruptHandler(void) 
{ 
//some code to be called on interruption 
} 
//main.cpp 
int main(void) 
{ 
    PINT p; 
    p = &(EPWMManager::Epwm1InterruptHandler); 
    return 0; 
} 

Al compilar me sale el siguiente:

error: a value of type "void (*)()" cannot be assigned to an entity of type "PINT"

supongo que me falta un poco de yeso

+1

La palabra clave 'interrupt' no es parte de C++. Debe ser una extensión específica de su implementación. ¿Qué sucede si lo elimina de las definiciones de 'PINT' y' Epwm1InterruptHandler'? ¿Todavía recibes un error? –

+0

En mi experiencia, la calidad de los compiladores de TI para procesadores DSP no es impresionante, incluso para C (por ejemplo, hemos rebotado más de una vez en errores del generador de código en casos límite de manejo de páginas). ¿Estás seguro de que migrar a un lenguaje mucho más complejo como C++ es una buena idea? – 6502

+0

si tomo 'interrumpir' el error está fuera ... Sin embargo, no estoy seguro de las implicaciones que tiene. Estaba pensando que migrar a C++ sería una buena idea para tener todo más estructurado (clases, objetos, patrones de diseño, etc.) ya que nuestro código C está empezando a verse muy desordenado. – TropE

Respuesta

2

Creo que el problema fundamental es el símbolo que antepone el RHS de su asignación a p. Además, "PINT" es "puntero a entero" en otros sistemas operativos. Así que evitemos cualquier posible conflicto de nombre. Pero creo que esto funcionará para usted:

// you may have to move "interrupt" keyword to the left of the "void" declaration. Or just remove it. 
typedef void (interrupt *FN_INTERRUPT_HANDLER)(void); 

interrupt void EPWMManager::Epwm1InterruptHandler(void) 
{ 
//some code to be called on interruption 
} 

int main(void) 
{ 
    FN_INTERRUPT_HANDLER p; 
    p = EPWMManager::Epwm1InterruptHandler; // no ampersand 

    // and if for whatever reason you wanted to invoke your function, you could just do this: 

    p(); // this will invoke your function. 

    return 0; 
} 
+0

Tienes razón. El código provisto funciona bien. Después de observar más de cerca mi código, observé que el typedef se declaró como C externo, lo que lo hacía incompatible con el código C++. Lo eliminé y funciona ahora. Gracias. – TropE

0

yo creo que hay varios errores de sintaxis no relacionada aquí: según entiendo su Epwm1InterruptHandler se supone que devuelve un puntero a una función del tipo de alarma, a continuación, quitar la primera orina de la línea

static interrupt void Epwm1InterruptHandler(void); 

y

static interrupt void Epwm1InterruptHandler(void); 

luego hacer p del tipo de alarma, y ​​luego poner entre paréntesis así:

interrupt p; 
p = &(EPWMManager::Epwm1InterruptHandler()); 
+0

Esa función * IS * es el controlador de interrupciones, no algo que devuelve un puntero a un manejador de interrupciones. – 6502

0

¿No te estás perdiendo un; después de typedef interrupt void (* PINT) (void)? Tu código compila para mí.

Cuestiones relacionadas