Hallo,
Laatst had ik een probleem met een watchdog timer maar dat is al opgelost, nog bedankt voor de reply's daarop
Helaas heb ik nu weer een ander probleem.
Ik heb een task Borstel. In de constructor maak ik een Sensor object aan.
Deze sensor heeft een watchdog timer, en als die afloopt wordt er een message via msgQSend gestuurd. Dit werkt echter prima.
Maar nu wil ik na een tijdje dat die Borstel task wordt gestopt en de Sensor en watchdog timer ook stoppen. Nou heb ik dit op de volgende manieren gedaan:
• taskDelete(borstel task)
• taskDeleteForce(borstel task)
• taskDelete in de borstel zelf (suicide)
• in de ISR methode van de sensor eerst kijken of een variable (klaar) nog false is zo niet stoppen doormiddel van de sensor te deleten en dan taskDelete
• een stop methode in de sensor die eerst de watchdog canceled, dan delete en dan zichzelf delete.
Geen van allen werken ze. Alleen de laatste werkt maar dan stoppen ze pas na 10 seconden nadat de klaar op true is gezet.
Borstel is een gespawned taak.
Borstel:
Sensor:
Dit is het laatste wat ik geprobeerd heb echter stopt deze ook niet.
Hoe kan ik nu een task + objecten stoppen+deleten op het moment dat ik dat wil?
Alvast bedankt
Laatst had ik een probleem met een watchdog timer maar dat is al opgelost, nog bedankt voor de reply's daarop
Helaas heb ik nu weer een ander probleem.
Ik heb een task Borstel. In de constructor maak ik een Sensor object aan.
Deze sensor heeft een watchdog timer, en als die afloopt wordt er een message via msgQSend gestuurd. Dit werkt echter prima.
Maar nu wil ik na een tijdje dat die Borstel task wordt gestopt en de Sensor en watchdog timer ook stoppen. Nou heb ik dit op de volgende manieren gedaan:
• taskDelete(borstel task)
• taskDeleteForce(borstel task)
• taskDelete in de borstel zelf (suicide)
• in de ISR methode van de sensor eerst kijken of een variable (klaar) nog false is zo niet stoppen doormiddel van de sensor te deleten en dan taskDelete
• een stop methode in de sensor die eerst de watchdog canceled, dan delete en dan zichzelf delete.
Geen van allen werken ze. Alleen de laatste werkt maar dan stoppen ze pas na 10 seconden nadat de klaar op true is gezet.
Borstel is een gespawned taak.
Borstel:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
| void Borstel::draai() { int klaar = wasMachine->isKlaar(); while(klaar != 1) { char msgBuf[MAX_MSG_LEN]; if (msgQReceive(msgQId, msgBuf, MAX_MSG_LEN, WAIT_FOREVER) == ERROR) { cout << "fout met msgQReceive in: " << naam << endl; } if(strcmp (msgBuf, "d") == 0) { cout << "Sensor "<<naam<<" is te dichtbij"<<endl; }else if(strcmp (msgBuf, "v") == 0) { cout << "Sensor "<<naam<<" is te veraf"<<endl; }else { cerr << "Sensor is not making sense" << endl; } taskDelay(sysClkRateGet()); klaar = wasMachine->isKlaar(); cout << "klaar: " << klaar << endl; } cout << "Sensor stop"<<endl; sensor->stop(); delete sensor; taskDelete(taskIdSelf()); } void borstelTask(char * naam, int w) { Borstel * b = new Borstel(naam,w); b->draai(); cout << naam << " is aan het draaien"<<endl; delete b; } |
Sensor:
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
| Sensor::Sensor(MSG_Q_ID msgQId, char * n) { this->msgQId = msgQId; naam = n; // wasMachine = w; if ((watchDogId = wdCreate( )) == NULL) { cout << "Fout met aanmaken watchdog" << endl; } cout << "Sensor aangemaakt: " << naam<<"Sensor" << endl; wdISR(); } void Sensor::wdISR() { wdStart(watchDogId, (sysClkRateGet()), (FUNCPTR)&wdCallBack, (int)this); char * message; int rndevent = rand()%20; cout << "sensor ISR" << endl; if(rndevent < 3) { message = "d"; msgQSend (msgQId, message, sizeof (message), NO_WAIT, MSG_PRI_NORMAL); }else if(rndevent > 17) { message = "v"; msgQSend (msgQId, message, sizeof (message), NO_WAIT, MSG_PRI_NORMAL); } } void Sensor::stop() { if ((wdCancel(watchDogId)) == ERROR) { cerr << "fout met cancellen watchdog" << endl; } if ((wdDelete(watchDogId)) == ERROR) { cerr << "Fout met deleten watchdog" << endl; } |
Dit is het laatste wat ik geprobeerd heb echter stopt deze ook niet.
Hoe kan ik nu een task + objecten stoppen+deleten op het moment dat ik dat wil?
Alvast bedankt