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
File:Sensor.h
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
File: Sensor.h
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
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