Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Deadlock Kategorie: Programmierung (von André H. - 30.08.2002 9:09)
Als Antwort auf Deadlock von Mario Fischer - 30.08.2002 3:42

Hallo Mario,

> Obwohl ich die Thread-Synchronisiermethodik der CC2 durchaus verstanden habe, komme ich bei folgendem Problem nicht weiter:
>
> Gegeben ein Thread filewriter der in eine Datei (globales Array file mit SchreibIndex file_ptr) schreiben soll.
>
> Im main-Thread wird nun von der Seriellen gelesen. Kommt der Befehl 's' zum Senden des Dateiinhalts (Lo/HiByte von file_ptr, dann file[0] bis file[file_ptr - 1]) soll der filewriter nicht waehrend des sendens die Datei veraendern. Deshalb existiert ein flag file_lock das den exklusiven Zugriff auf die Datei sichern soll.
>

> Sowohl main als auch filewriter capturen/releasen den Codeteuil, indem sie von file oder file_ptr lesen oder schreiben.

> Natuerlich hat das Programm unten so keinen Sinn, es ist eben nur der problematische Teil, so weit wie moeglich gekuerzt.
> Darum sind auch Vorschlaege wie "mach doch ein halt/resume auf den filewriter" leider keine Loesung.
>

Das Problem liegt wahrscheinlich hauptsächlich daran, da� man bei der
CC2 keine verschachtelten capture verwenden darf. In hwcom wird bereits
ein capture verwendet. Wenn Du jetzt noch ein Capture herum baust,
dann bleibt die CC2 spätestens beim zweiten durchlauf stehen stehen.

Die Lösung: Ein "Software"-Capture.
Die Prio der Threads sollte aber nicht kleiner 15 sein.


// das schoene Programm:
const FILESIZE = 511;
byte  file_lock;
int   file_ptr;
byte  file[FILESIZE];

thread filewriter // in datei schreiben
{
  loop
  {yield;
    if file_lock==0
     {file_lock=255;break;}
  }
 
  if (fileptr < FILESIZE)
   {
    file[file_ptr] = file_ptr;
    file_ptr = file_ptr + 1;
   }

  file_lock=0;//=SW-Cap-Release

  sleep 500;
}

thread main
{
  byte      rxbuf;
  file_ptr  = 0;
  file_lock = 0;
  run filewriter;
  loop
  {
   wait hwcom.rxd();
   rxbuf = hwcom.get();
   if ('s' == rxbuf) // datei senden
    {
     loop
     {yield;
      if file_lock==0
        {file_lock=255;break;}
     }

     hwcom.put(fileptr);
     hwcom.put(fileptr >> 8);
     hwcom.send(file, fileptr);

     wait hwcom.ready();

     file_lock=0;
    }
   if ('e' == rxbuf) // echo test, ob mainthread noch ok
    {
     hwcom.put('e');
    }
  }
}



Antworten bitte nur ins Forum!
Fragen per EMail auf Forum-Postings werden nicht beantwortet!

Das macht meine Heizung gerade


    Antwort schreiben


Antworten:

Re: Deadlock (von Mario Fischer - 31.08.2002 1:53)
    Re: Deadlock (von André H. - 31.08.2002 8:33)