Re: Vorteile mit cap.c2 ? Kategorie: Programmierung (von André H. - 15.06.2006 22:05) | ||
Als Antwort auf Vorteile mit cap.c2 ? von Norbert - 14.06.2006 18:09 | ||
| ||
Hallo Norbert, Ich mu� der richtigen Aussage von krassos noch etwas hinzufügen: Es gibt prinzipell zwei Arten von Captures: 1. Das Systemeigene mit den Schlüsselworten capture und release. Diese dürfen auf keinen Fall verschachtelt werden, da dies zu einem Deadlock führen würde. 2. Die erweiterten Captures des Moduls cap.c2 und das I²C-Bus-Capture. Diese funktionieren komplett unabhängig vom System-Capture und beeinflussen es in keinster weise. Es stehen somit insgesamt 18 Captures bereit. 1x das Systemeigene 1x das I²C-Bus-Capture 16x vom Modul cap.c2 . Man könnte somit insgesamt auf 18 Ebenen verschachtelt capturen. Dabei mu� nur folgendes beachtet werden. Nur das Systemeigne Capture kann implizit und explizit verwendet werden. Die anderen Captures sind alle explizit. Im Extremfall kann mal also so ein Konstrukt schreiben: capture flag; wait i2c.Capture(); wait cap.Capture(0); wait cap.Capture(1); wait cap.Capture(2); wait cap.Capture(3); wait cap.Capture(4); wait cap.Capture(5); wait cap.Capture(6); wait cap.Capture(7); wait cap.Capture(8); wait cap.Capture(9); wait cap.Capture(10); wait cap.Capture(11); wait cap.Capture(12); wait cap.Capture(13); wait cap.Capture(14); wait cap.Capture(15); cap.Release(15); cap.Release(14); cap.Release(13); cap.Release(12); cap.Release(11); cap.Release(10); cap.Release(9); cap.Release(8); cap.Release(7); cap.Release(6); cap.Release(5); cap.Release(4); cap.Release(3); cap.Release(2); cap.Release(1); cap.Release(0); i2c.stop(); //Das I²C-Capture wird mit I²C-Stop gelöst release; Die Reihenfolge ist nicht bindend. Es sollten aber die Captures, die zuletzt gesetzt wurden, auch wieder zuerst gelöst werden. Wenn das ganze nicht so wäre, würde mein Modul cap.c2, sowie das eigene I²C-Bus-Capture keinerlei Sinn machen. ;-) Zu einem Deadlock kommt es nur, wenn Du zwei gleiche Captures verschachtelst. Als Beispiele: capture flag1; capture flag2; //<= deadlock Aber auch: wait i2c.Capture(); wait i2c.Capture(); //<= deadlock Oder: wait cap.Capture(11); wait cap.Capture(11); //<= deadlock Es kann aber auch zu einem Deadlock kommen, wenn Du verschiedene Captures verschachtelst, diese aber z.B. in anderer Reihenfolge wieder freigegeben werden, als Sie gesetzt wurden: thread a { ... wait cap.Capture(4); ... wait cap.Capture(15); .. cap.Release(4); cap.Release(15);// das hier selbst führt noch nicht zum Deadlock ... } thread b {... wait cap.Capture(15); ... wait cap.Capture(4); ... cap.Release(15); ... cap.Release(4); // Aber diese Kombination schon ... } Wenn thread b aber in der richtigen Reihenfolge die Captures wieder löst, ginge es wieder: thread b {... wait cap.Capture(4); ... wait cap.Capture(15); ... cap.Release(15); ... cap.Release(4); ... } Allerdings kann man die Captures von cap.c2 und das I²C-Bus-Capture "per Hand" wieder lösen: Dazu kann man beim I²C-Bus-Capture einfach aus einem anderem (nicht wartenden ;-) ) Thread i2c.stop() aufrufen. Bei Captures von cap.c2 geht das genauso mit cap.Release(). Ich würde sagen, schreibe Dir ein paar kleine Testprogramme und experimentiere ein wenig. ;-) MfG André H. Antworten bitte nur ins Forum! Fragen per EMail auf Forum-Postings werden nicht beantwortet! Das macht meine Heizung gerade | ||
Antwort schreiben Antworten: Re: Vorteile mit cap.c2 ? (von Norbert - 16.06.2006 7:55) |