Funktionspointer in Array von Klassenfunktionen



  • Hallo miteinander

    Ich habe ein kleines Problem: Ich möchte von einer C-Datei aus bestimmte Funktionen aufrufen können. Diese Funktionen sind variabel und sollen "registriert" werden. Aber leider stehe ich momentan auf dem Schlauch:

    irq.h

    class CIRQHandling
    {  
    	typedef void (*m_pu32FunctionPtr)(sf_uint32 eIRQSource);
    
        private:  
    		m_pu32FunctionPtr m__au32IRQHandler[35];
    
        /// Functions
        public:
    		CIRQHandling();
    		~CIRQHandling();
    
    		sf_bool bAddIRQHandler(m_pu32FunctionPtr pIRQH, sf_uint32 eIRQSource);
    		sf_bool bRemoveIRQHandler(sf_uint32 eIRQSource);
    		static void IRQHandler(sf_uint32 eIRQSource);
    
    };
    

    irq.cpp
    Hier sollen sich die anderen Klassen für die entsprechenden Interrupts registrieren können. IRQHandler soll dann von der c-Funktion aus aufgerufen werden.

    sf_bool CIRQHandling::bAddIRQHandler(m_pu32FunctionPtr pIRQH, sf_uint32 eIRQSource)
    {
    	if (m__au32IRQHandler[eIRQSource] == NULL)
    	{
    		m__au32IRQHandler[eIRQSource] = pIRQH;
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }
    sf_bool CIRQHandling::bRemoveIRQHandler(sf_uint32 eIRQSource)
    {
    	m__au32IRQHandler[eIRQSource] = NULL;
    	return 1;
    }
    
    void CIRQHandling::IRQHandler(sf_uint32 eIRQSource)
    {
    	CIRQHandling* CirqHandler;
    	CirqHandler->m__au32IRQHandler[eIRQSource](eIRQSource);
    }
    

    interrupt.c

    void SysTick_Handler(void)
    {
    	CIRQHandling::IRQHandler(2);
    }
    

    main.cpp
    Zum Testen irgend eine Klasse mit einer Funktion die bei der irq-Klasse registert und dann durchgeschlauft auch aufgerufen werden soll, sobald die Funktion SysTick_Handler in der obigen Datei ausgeführt wird.

    class testclass
    {
    	public:
    		void hallo(void)
    		{
    			//...
    		}
    };
    
    int main(void)
    {
    	(void) irqTest.bAddIRQHandler(&tester::hallo, eetUSART1);
    	while(1)
    	{
    	}
    	return 0;
    }
    

    Momentan bekomme ich das Registrieren irgenwie nicht so hin. Oder habt ihr noch konkrete Vorschläge?
    Besten Dank für die Hilfe
    MFG
    P51D



  • Nicht statische Memberfunktionen brauchen einen this Pointer, den du so nicht liefern kannst. Wenn du std::function und std::bind benutzt (oder boost für nicht c++11 Compiler) wird es funktionieren.

    Deine IRQHandler Funktion wird allerdings auch nur abstürzen, wenn du sie wirklich so wie hier gepostet implementiert hast.



  • manni66 schrieb:

    Deine IRQHandler Funktion wird allerdings auch nur abstürzen, wenn du sie wirklich so wie hier gepostet implementiert hast.

    Wie sollte es dann aussehen?



  • P51D schrieb:

    manni66 schrieb:

    Deine IRQHandler Funktion wird allerdings auch nur abstürzen, wenn du sie wirklich so wie hier gepostet implementiert hast.

    Wie sollte es dann aussehen?

    Hast du überhaupt verstanden was daran falsch ist?


Log in to reply