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

Wichtig: Bevor Du wegen einem Problem mit der CC2 postest, stelle sicher, daß Du
die neueste OS-Version, die neuseste Compiler-DLL und die neuesten Modulversionen benutzt!
Beachte, daß sich auf der CD zur CC2-Unit/Station auch jetzt noch die ältesten Dateien befinden!
Es gelten folgende Anleitung und Regeln: Regeln CC2Net.de-Forum
Zurück zum Artikel  (Blaue Felder sind Pflichtfelder)


Name:   UserID: 
 E-Mail:
Kategorie
Betreff
Homepage:
Link-Titel:
Link-URL:
Cookie für Name, UserID, E-Mail, Homepage-URL setzen
(Erspart die Neueingabe bei Beiträgen und Antworten)
(Zum Löschen des Cookies hier klicken)
Ich nutze:
C-Control II Unit
C164CI-Controllerboard
C-Control II Station
CCRP5 mit CC2-Unit (Conrad Roboter)
CC2-Application-Board
CC2-StarterBoard
CC2-ReglerBoard
eigenes Board
original OS     OSOPT_V2     OSOPT V3.0 OSOPT V3.1

Kommentar:
Einfügen von HTML im Kommentar:

Link einfügen: <a href="LINKURL" target="_blank">LINKTITEL</a>
Bild einfügen: <img src="BILDURL">
Text formatieren: <b>fetter Text</b>  <i>kursiver Text</i> <u>unterstrichener Text</u>
Kombinationen sind auch möglich z.B.: <b><i>fetter & kursiver Text</i></b>
C2 Quellcode formatieren: <code>Quellcode</code>
ASM Quellcode formatieren: <asm>Quellcode</asm>
(Innerhalb eines Quellcodeabschnitts ist kein html möglich.)
Wichtig: Bitte mache Zeilenumbrüche, bevor Du am rechten Rand des Eingabefeldes ankommst !  

> Hi, > > hier mal eineinfaches beispiel. > im thread producer wird das signal vom can-bus gelesen und in signale gespeichert. > ausserdem wird in signale auch gespeichert wieviele signale dort momentan gespeichert sind. > > der thread consumer nimmt die signale und verarbeitet sie (er konsumiert). > versuche dir klarzumachen was passiert, wenn im falschen moment > zwischen den threads umgeschaltet wird (stelle habe ich markiert) > > achtung: selbst wenn du nur eine zeile code benötigst um eine > variable die von mehreren thread benutzt wird zu bearbeiten, heisst das nicht, > dass das in maschinencode auch nur ein befehl ist. > > a = a + 1 > > wäre zb etwas wie: > > LOAD a > // thread wechsle möglich! > LOAD 1 > // thread wechsle möglich! > ADD > > abhilfe schafft also das capture: > zu jeder variable v die von mehreren threads benutzt wird erstellst du eine globale lock variable. > immer wenn du v ändern willst speicherst du das in lock. > > etwa so: > > if lock: > warte bis lock == 0 > else > lock == 1 > > mache was mit v > > lock == 0 > > das problem bei dieser lösung: falls hier im falschen zeitpunkt > zwischen den threads umgeschaltet wird hast du das gleiche problem wie mit v an anderer stelle. > > nutze daher capture lock. > > die cc2 stellt sicher, dass während der bearbeitung von > capture nicht zwischen den threads umgeschaltet wird. > > > > > > <code> > > type signale_typ{ > > byte elemente; //anzahl der momentan zwischengespeicherten signale > byte element[MAX]; > > } > > signale_typ signale; > > byte lock; /* Synchronisationsvariable. (GLOBAL) > > > thread producer{ > > signal = canbus.lese_signal(); > > //geschützen bereich betreten, vorher warten bis consumer ihn verlässt > capture lock; > > signale.elemente = signale.elemente + 1; > // chaos wenn zu thread consumer gewechselt würde (ohne capture) > signale.element[ signale.elemente ] = signal; > > release lock; //geschützen bereich verlassen, consumer kann jetzt eintreten > > } > > thread consumer{ > > // warten auf neue signale > // (hat nichts mit capture zu tun, wird aber oft im zusammenhang benötigt) > wait signale.elemente; > > //geschützen bereich betreten, vorher warten bis producer ihn verlässt > capture lock; > > konsumiere( signale.element[ signale.elemente ] ); > // chaos wenn zu thread producer gewechselt würde (ohne capture) > signale.elemente = signale.elemente - 1; > > //geschützen bereich verlassen, producer kann jetzt eintreten > release lock; > > } > > > </code>
Dateianhang: (.gif, .png., .jpg, .zip, .rar)
max. 256kB
max. 256kB