Stolperfalle Waitsema/Resume

Multitasking TWInet

rbr50
 
Avatar
 
Betreff:

Stolperfalle Waitsema/Resume

 · 
Gepostet: 07.02.2012 - 20:18 Uhr  ·  #1
Hallo,

ich habe eine TWInet-Process, fast 1:1 aus den Beispielen

Code
Process RxMasterFrame(40, 80 : iData);
var
  ww         : word;
begin
  WaitSema(TWIrxSEMA);
  Toggle(LEDRot);
  case NetRxRec.cmd of
    '1'       : NetTxRec.Result:= '1';
                NetTxRec.stS:= 'Result 1';
                TWItxFrame(02, byte(sizeOf(tNetTxRec)));
              |
    '2'       : NetTxRec.Result:= '2';
                NetTxRec.stS:= 'Result 2';
                TWItxFrame(02, byte(sizeOf(tNetTxRec)));
              |
    '3'       : Lock(self);        // do not disturb the beeper by scheduling :-)
                BeepChirpH(1);
                UnLock(self);
              |
  endcase;
  // This is mandatory !!!
  // The master can not send another frame until the slave has processed
  // the frame and flags this by the "TWIrxClear" function.
  TWIRXCLEAR;
end;


Aus dem Mainloop heraus schalte ich diesen Process gelegentlich mit einem suspend ab, um Ihn bei Bedarf wieder aufzuwecken. Dabei stellte ich fest, dass meine rote LED blinkt, obwohl auf dem I2C-Bus definitiv nichts los war.
Nach langem Suchen habe ich mich dann an die Aussage von rh erinnert:
Zitat
Bei einem Prozess wird nach einem Resume wieder da weitergemacht wo das Suspend stand, also hinter dem Suspend.


Der Process stand in WaitSema(TWIrxSEMA); Dann kam aus dem Main das suspend. Nächste Zeile im Process ist Toggle(LEDRot); Und die wird jetzt wie beschrieben ausgeführt.

Vermeintliches Wunder war also doch keins! ;-)

Viele Grüße bei minus 12° aus Petershagen!

Rolf
ThomasW69
 
Avatar
 
Betreff:

Re: Stolperfalle Waitsema/Resume

 · 
Gepostet: 08.02.2012 - 14:36 Uhr  ·  #2
Heißt das jetzt, dass bei einem Suspend im Main dennoch der Code im Prozess ausgeführt wird der nach dem suspend kommt?
Ich dachte immer der bleibt da stehen wo das suspend ausgelöst wurde und springt erst wieder nach einem resume an.
rbr50
 
Avatar
 
Betreff:

Re: Stolperfalle Waitsema/Resume

 · 
Gepostet: 08.02.2012 - 17:12 Uhr  ·  #3
Hallo Thomas,

stimmt, ich habe mich nicht richtig ausgedrückt. Danke für den Hinweis.
Natürlich springt die Routine erst wieder nach einem Resume an. Und zwar mit der Zeile, die dem Suspend folgt.
Und das war in meinem Fall Toggle(LEDRot). Und das hatte mich eben irritiert, denn auf dem I2C-Bus war nichts los.
Rolf hat mir das hier irgendwo im Forum erklärt, such mal nach Resume, Suspend.

Also der Compiler funktioniert wie er soll.

Viele Grüße, Rolf
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 13   64   77 · Page-Gen-Time: 0.027793s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI