2017-09-20 4 views
0

j'ai écrit le programme C++ à base MBED suivante comme une expérience pour un projet plus détaillé, je travaille sur mon Nucleoboard Microcontroller:Je ne peux pas obtenir un ticker MBED dans une classe d'appeler une méthode membre

#include "mbed.h" 

DigitalOut greenLed(PA_5); 

#include "mbed.h" 
class TimedLED 
{ 
    public: 
     TimedLED() 
     { 
      Ticker t; 
      t.attach_us(this, &TimedLED::flip, 1000000); 
     } 

     void flip(void) 
     { 
      static int count = 0; 
      greenLed.write(count%2); //-- toggle greenLed 
      count++; 
     } 
}; 

int main() 
{ 
    TimedLED flash; 
    while (1); 
} 

Toutes les références que j'ai regardées semblaient indiquer que t.attach_us (this, & TimedLED :: flip, 1000000) devrait appeler la méthode, 'flip' toutes les secondes et ainsi provoquer l'activation et la désactivation de la LED. Cela ne se passe pas, cependant. Je ne peux pas voir quel est le problème. J'espère que quelqu'un pourra m'aider à éclaircir ça.

Je reçois le message d'avertissement suivant indiquant que ce format est dépréciée, mais le lien vers la documentation était cassé, donc je ne pouvais pas obtenir plus de détails:

Function "mbed::Ticker::attach_us(T *, M, us_timestamp_t) [with T=TimedLED, M=void(TimedLED::*)()]" (declared at /extras/mbed_fd96258d940d/drivers/Ticker.h:122) was declared "deprecated" "t.attach_us(this, &TimedLED::flip, 1000000);" 

Même si elle est dépréciée, il devrait encore fonctionner, n'est-ce pas? Aussi, probablement si le message de dépréciation est correct, il y a une manière plus récente de faire la même chose. Je ne peux pas trouver de référence à une méthode alternative mais n'importe où.

Répondre

1

Vous déclarez dans votre Ticker t; constructeur sur la pile, lorsque le constructeur sort, il effacera l'objet, et donc le code ne fonctionnera pas.

Déclarez la variable dans votre classe, et il va courir comme prévu:

class TimedLED 
{ 
    public: 
     TimedLED() 
     { 
      t.attach(callback(this, &TimedLED::flip), 1.0f); 
     } 

     void flip(void) 
     { 
      static int count = 0; 
      greenLed.write(count%2); //-- toggle greenLed 
      count++; 
     } 

    private: 
     Ticker t; 
}; 

Notez également le changement dans le constructeur, c'est le preferred (non dépréciée) façon de fixer callbacks dans mbed OS 5.

+0

Merci Jan. J'apprends le C++ en même temps que le mbed, donc il m'est facile de passer à côté de points importants comme le fait que t devait être déclaré comme membre de données s'il devait avoir de la portée classe. –