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) |