[VxWorks]Tasks blijven actief na een taskDelete

Pagina: 1
Acties:

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
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:
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

  • Rowwan
  • Registratie: November 2000
  • Nu online
Wat gaat er precies mis? Crash?

En wat is de waarde van MAX_MSG_LEN? In draai() blijf je wachten op MAX_MSG_LEN, terwijl e maar 1 char verstuurd (terwijl sizeof(message) == 4)

en wat de oplossing van je vorige probleem?

Alleen code dumpen wordt meestal niet gewaardeerd ;)

  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Wat er mis gaat is dat die Sensor wdISR door blijft gaan zelfs wanneer ik de borstel task heb gedelete met taskDelete(). :(

Vorige probleem kon worden opgelost met een static callback methode.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
eppie schreef op donderdag 14 juli 2005 @ 17:37:
Wat er mis gaat is dat die Sensor wdISR door blijft gaan zelfs wanneer ik de borstel task heb gedelete met taskDelete(). :(

Vorige probleem kon worden opgelost met een static callback methode.
Ik zei het toen, ik zeg het nu weer, je code suggereert dat je in de ISR een infinite wait hebt. Dat lijkt me niet correct. En ik zie er nu nog meer.

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.


  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Waar zie je nog een Wait dan? heb nu alleen nog maar NO_WAITS zover ik het kan zien :)

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 22:23
C++:
1
2
3
4
if (msgQReceive(msgQId, msgBuf, MAX_MSG_LEN, WAIT_FOREVER) == ERROR) 
{
    cout << "fout met msgQReceive in: " << naam << endl;
} 
Verder zou ik de code zoveel mogelijk statisch houden, als je je deterministische gedrag wilt houden. Ook zou ik denken dat je een soort van join moet doen om geen zombie processen/threads achter te laten, maar dat weet ik niet zeker. Ik ken vxWorks niet....

Sowieso is een blocking call in dit soort software not done, 1 deadlock en je systeem wordt gereset.

[ Voor 70% gewijzigd door farlane op 14-07-2005 22:36 ]

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.


  • eppie
  • Registratie: Maart 2000
  • Niet online
(overleden)
Die wait_forever had ik helemaal over het hoofd gezien thx :)

Heb de oplossing ook al gevonden, ik verwijderde de task al voordat hij de kans kreeg zelf de watchdog te stoppen.
Pagina: 1