2011-09-15 18 views
5

Non ho scritto codice C++ da molto tempo; comunque ora devo lavorare su un DSP F28335 di strumenti texas e sto provando a migrare da C a C++. Ho il seguente codice che sta cercando di inizializzare una routine di servizio di interruzione con un metodo statico di una classe:Puntatore cast di C++ al metodo statico

//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; 
} 

Quando si compila ottengo il seguente:

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

Credo che mi manca qualche cast.

+1

La parola chiave 'interrupt' non fa parte di C++. Deve essere un'estensione specifica per la tua implementazione. Cosa succede se lo rimuovi dalle definizioni di 'PINT' e' Epwm1InterruptHandler'? Hai ancora un errore? –

+0

Nella mia esperienza la qualità dei compilatori TI per i processori DSP non è impressionante nemmeno per C (ad esempio siamo rimbalzati più di una volta in bug del generatore di codice sui casi limite di gestione delle pagine). Sei sicuro che la migrazione a un linguaggio molto più complesso come il C++ sia una buona idea? – 6502

+0

se prendo "interrupt" l'errore è fuori ... Tuttavia non sono sicuro delle implicazioni che ha. Stavo pensando che migrare al C++ sarebbe una buona idea per avere tutto più strutturato (classi, oggetti, schemi di progettazione, ecc.) Poiché il nostro codice C sta iniziando a sembrare molto disordinato. – TropE

risposta

2

Penso che il problema fondamentale sia che la e commerciale anteponendo l'RHS del proprio compito a p. Inoltre, "PINT" è "puntatore a numero intero" in altri sistemi operativi. Evitiamo qualsiasi potenziale conflitto di nome. Ma penso che questo funzioni per voi:

// 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

Hai ragione. Il codice fornito funziona bene. Dopo uno sguardo più attento al mio codice ho osservato che il typedef è stato dichiarato come C esterno, rendendolo incompatibile con il codice C++. L'ho rimosso e ora funziona. Grazie. – TropE

0

Penso che tu abbia diversi errori di sintassi non correlato qui: a quanto ho capito il tuo Epwm1InterruptHandler dovrebbe restituire un puntatore a una funzione di tipo di allarme, quindi rimuovere nulla dalla linea

static interrupt void Epwm1InterruptHandler(void); 

e

static interrupt void Epwm1InterruptHandler(void); 

poi fare p di tipo di allarme, e poi mettere tra parentesi in questo modo:

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

Tale funzione * È * il gestore di interrupt, non qualcosa che restituisce un puntatore a un gestore di interrupt. – 6502

0

Non ti manca un; dopo typedef interrupt void (* PINT) (void)? Il tuo codice viene compilato per me.

Problemi correlati