2015-03-12 2 views
1

J'essaie d'utiliser un RtosTimer dans une classe mais le mbed se bloque. Je pense que c'est parce que j'appelle threadHelper chaque tick et sa création d'un nouveau pointeur alors que je veux réellement appeler threadMethod chaque tick ou appeler threadHeper chaque tick mais utiliser le même pointeur. Est-ce que quelqu'un peut me montrer comment je devrais faire cela?Utilisation d'un RtosTimer dans une classe

Le code ci-dessous fonctionne pour un RtosThread parce que threadHelper n'est appelé qu'une seule fois, mais j'ai besoin d'utiliser un temporisateur Rtos.

.h

#ifndef TEST_CLASS_H 
#define TEST_CLASS_H 

#include "mbed.h" 
#include "rtos.h" 

/** TestClass class. 
* Used for demonstrating stuff. 
*/ 
class TestClass 
{ 
public: 
    /** Create a TestClass object with the specified specifics 
    * 
    * @param led The LED pin. 
    * @param flashRate The rate to flash the LED at in Hz. 
    */ 
    TestClass(PinName led, float flashRate); 

    /** Start flashing the LED using a Thread 
    */ 
    void start(); 

private: 
    //Member variables 
    DigitalOut m_Led; 
    float m_FlashRate; 
    RtosTimer *m_rtosTimer; 

    //Internal methods 
    static void threadHelper(const void* arg); 
    void threadMethod(); 
}; 

#endif 

cpp

#include "TestClass.h" 

TestClass::TestClass(PinName led, float flashRate) : m_Led(led, 0), m_FlashRate(flashRate) 
{ 
    //NOTE: The RTOS hasn't started yet, so we can't create the internal thread here 
} 

void TestClass::start() 
{ 
    m_rtosTimer = new RtosTimer(&TestClass::threadHelper, osTimerPeriodic, (void *)0); 
    int updateTime = (1.0/m_FlashRate) * 1000; 
    m_rtosTimer->start(updateTime); 
} 

void TestClass::threadHelper(const void* arg) 
{ 
    //Cast the argument to a TestClass instance pointer 
    TestClass* instance = (TestClass*)arg; 

    //Call the thread method for the TestClass instance 
    instance ->threadMethod(); 
} 

void TestClass::threadMethod() 
{ 
    //Do some stuff 
} 

Merci

Répondre

2

Le pointeur arg passé à threadHelper() est l'argument que vous avez passé ot le constructeur RtosTimer - dans ce cas, un pointeur NULL. threadHelper() dereferences ce null-pointeur provoquant une erreur d'exécution.

Au lieu de cela:

m_rtosTimer = new RtosTimer(&TestClass::threadHelper, osTimerPeriodic, (void*)this); 
+0

Merci, fonctionne parfaitement –