Stolperfalle Waitsema/Resume

Multitasking TWInet

rbr50
 
Avatar
 
Subject:

Stolperfalle Waitsema/Resume

 · 
Posted: 07.02.2012 - 20:18  ·  #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:
Quote
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
 
Subject:

Re: Stolperfalle Waitsema/Resume

 · 
Posted: 08.02.2012 - 14:36  ·  #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
 
Subject:

Re: Stolperfalle Waitsema/Resume

 · 
Posted: 08.02.2012 - 17:12  ·  #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
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 13   64   77 · Page-Gen-Time: 0.023786s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI