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

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
Ich nutze:
C-Control II Unit, C164CI-ControllerBoard, CC2-Application-Board, CC2-StarterBoard, CC2-ReglerBoard, OSOPT V3.0, OSOPT V3.1
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)