Visualizzazione dei risultati da 1 a 6 su 6

Discussione: C++ Interrupt

  1. #1

    C++ Interrupt

    Ciao a tutti ho un problema,

    ho una funzione per registrare un interrupt, con questo prototipo:

    codice:
    Error_t __DECL ddcSetBCRTEvent(Device_p pCrd, Error_t(*usr_handler)(Device_p pCrd, S16BIT type, S16BIT param));
    se la utilizzo in codice c non dà problemi. Io però ho bisogno di includerla in un mio progetto c++ ed ho utilizzato queste classi:

    file PInterruptHandler.h

    codice:
    class PInterruptHandler
    {
    private:
    	PConfigurationCard *configurationCard;
    	static PInterruptHandler *objPtr;
    public:
    	PInterruptHandler(PConfigurationCard* configCard);
    	PInterruptHandler(void);
    	~PInterruptHandler(void);
    
    	Error_t BcIRQHandler(Device_p _pISRCrd, S16BIT _intrType, S16BIT _param);
    
    	static Error_t CallBackBcIRQHandler (Device_p _pISRCrd, S16BIT _intrType, S16BIT _param)
    	{
    		return objPtr->BcIRQHandler(_pISRCrd, _intrType, _param);
    	}
    public:
    	
    	list<MESSAGE> *messageList;
    };
    file PInterruptHandler.cpp

    codice:
     PInterruptHandler::PInterruptHandler(void)
    {
    }
    
    PInterruptHandler::~PInterruptHandler(void)
    {
    	PInterruptHandler::objPtr = nullptr;
    }
    
    PInterruptHandler::PInterruptHandler(PConfigurationCard *configCard)
    {
    	this->configurationCard = configCard;
    	PInterruptHandler::objPtr = this;
    }
    
    Error_t PInterruptHandler::BcIRQHandler(Device_p _pISRCrd, S16BIT _intrType, S16BIT _param)
    {
    ...
    }
    
    PInterruptHandler *PInterruptHandler::objPtr = nullptr;
    ho utilizzato un'altra classe, chiamata PBusController, per registrare il metodo statico in questo modo:

    PBusController.h

    codice:
    PBusController::PBusController(PConfigurationCard* configCard)
    {
    	...
    	this->interruptHandler = new PInterruptHandler(this->configurationCard);
    	...
    }
     
    S32BIT PBusController::SetInterrupt(S16BIT mask)
    {
    	S32BIT Err;
    	if(Err = ddcSetBCRTEvent(this->configurationCard->device, &(PInterruptHandler::CallBackBcIRQHandler)))
    	{
    		return Err;
    	}
    	...
    }
    La compilazione va a buon fine, ma quando viene generato l'interrupt il programma va in crash.

    Non so più cosa fare, qualcuno ha qualche idea???

    Grazie!!!!!

  2. #2
    Forse per la calling convention richiesta dal callback non va bene un membro static della classe... non riesci ad ottenere qualche informazione in più su questo crash?
    Esattamente su che piattaforma stai lavorando?
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    no purtroppo non ho altre informazioni sul crash, ma sembra che quando l'interrupt viene lanciato, il programma va a leggere in una locazione di memoria non accessibile. Stò lavorando in ambiente windows.

    Grazie.

  4. #4
    Prova a mettere prima del return una qualche istruzione di segnalazione, per vedere se almeno entra nella procedura correttamente.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Va in crash prima di entrare nella funzione, ho già controllato con i Break point. E' come se l'interrupt fosse registrato su una locazione sbagliata. Questo succede solo se utilizzo la programmazione a oggetti, se utilizzo il c classico funziona tutto correttamente.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ho l'impressione che il problema sia molto subdolo e riguardi questa assegnazione:
    codice:
    PInterruptHandler::objPtr = this;
    Non vorrei che la callback ritornasse dopo che l'oggetto di PInterruptHandler sia uscito dallo scope. In quel caso objptr non sarebbe più valido e il programma va in crash.
    (Mi è capitata una cosa simile lavorando con i thread).
    Hai altri dettagli su ddcSetBCRTEvent il tipo di parametri ad esempio, se è sincrona o asincrona.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.