[VxWorks]Watchdog timer wil niet werken

Pagina: 1
Acties:

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Hallo,

Ik zit met een probleem met een watchdog timer waar ik niet uit kom.

Er is een class Sensor met een methode die doormiddel van een watchdog periodiek een
msgQSend uitvoerd.

Nou heb ik op inet verschillende manieren gevonden hoe het wel zou moeten werken.

Manier 1
File: Sensor.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Sensor::Sensor(MSG_Q_ID msgQId, char * n)
{
  this->msgQId = msgQId;
 if ((watchDogId = wdCreate( )) == NULL)
  {
    cout << "Fout met aanmaken watchdog" << endl;
  }     

  if (wdStart (watchDogId, (sysClkRateGet()/2), (FUNCPTR)wdISR, NULL) == ERROR) 
  {
    cout << "Fout met starten watchdog" << endl;
  }
}

//Doet het 1 keer en crashed dan.
void Sensor::wdISR()
{
    wdStart(watchDogId, (sysClkRateGet()/2), (FUNCPTR)wdISR, NULL);
    cout << "doe wat "<<endl;
    char * message;
    message = "o";
    msgQSend (msgQId, message, sizeof (message), WAIT_FOREVER,MSG_PRI_NORMAL);
}

void sensorTask(MSG_Q_ID msgQId, char * n)
{
  Sensor *s = new Sensor(msgQId, n);
}

File:Sensor.h
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "wdLib.h"
#include "msgQLib.h"

class Sensor{
private:
  MSG_Q_ID msgQId;
  WDOG_ID watchDogId;
  char * naam;
public:
  Sensor(MSG_Q_ID, char *);
  void wdISR();
};
void sensorTask(MSG_Q_ID, char *);
#endif

Nou voert hij 1 keer die wdISR methode uit en daarna crashed mijn vxworks simulator. (die van tornado2).
Nu las ik op inet oa dat je dat het alleen met een static callback methode kon.

Manier 2:
File:Sensor.cpp
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sensor::Sensor(MSG_Q_ID msgQId, char * n)
{
  this->msgQId = msgQId;
 if ((watchDogId = wdCreate( )) == NULL)
  {
    cout << "Fout met aanmaken watchdog" << endl;
  }     

  if (wdStart (watchDogId, (sysClkRateGet()/2), (FUNCPTR)&wdCallBack, (int)this) == ERROR) 
  {
    cout << "Fout met starten watchdog" << endl;
  }
}

void Sensor::doIt()
{
    wdStart(watchDogId, (sysClkRateGet()/2), (FUNCPTR)wdISR, NULL);
    cout << "doe wat "<<endl;
    char * message;
    message = "o";
    msgQSend (msgQId, message, sizeof (message), WAIT_FOREVER,MSG_PRI_NORMAL);
}

void sensorTask(MSG_Q_ID msgQId, char * n)
{
  Sensor *s = new Sensor(msgQId, n);
}

File: Sensor.h
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "wdLib.h"
#include "msgQLib.h"

class Sensor{
private:
  MSG_Q_ID msgQId;
  WDOG_ID watchDogId;
  char * naam;
  static void wdCallBack(int sensor)
  {
    Sensor *s = (Sensor *)sensor;
    s->doIt();
  }
 
public:
  Sensor(MSG_Q_ID, char *);
};
void sensorTask(MSG_Q_ID, char *);
#endif


Deze 2e manier blijft echter wel werken als ik in de doIt() alleen een coutje plaats. Zodra ik die msgQSend weer uitvoer crashed vxworks weer.

Ook was het een manier om de ISR functie globaal te maken maar dit werkte echter ook niet.

Ik heb dan ook geen enkel idee meer hoe ik dit kan oplossen :(

Hopelijk hebben jullie een idee :)

Alvast bedankt voor de moeite

  • Rowwan
  • Registratie: November 2000
  • Laatst online: 19:51
sizeof(message) == 4; Dit is de length van een char*
Probeer eens strlen(message) :Y)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 07-05 10:04
Jouw code suggereert dat je een 'wait forever' doet in een ISR. Dat lijkt me geen zuivere koffie :)

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
De eerste lijkt inderdaad fout; een member pointer is geen functie pointer. Als je een cast nodig hebt, is dat meestal een teken dat er iets fout zit. De tweede lijkt er meer op. Weliswaar zou ik de static method ook gewoon in de .cpp zetten, maar dat is alleen stijl.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein