Process oder Task

  • 1
  • 2
  • Seite 1 von 2
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Process oder Task

 · 
Gepostet: 23.06.2026 - 19:36 Uhr  ·  #1
Ich habe versucht ein Demo für Process und Task zu finden, aber ich finde nichts.
Kann auch sein das ich etwas übersehen habe.

Mein Problem ist, ich muss bei meinen XMega256 die UART F0 alle 300ms abfragen,
Ob neue Daten da sind.

Wer von euch Arbeitet mit Process und kann mal ein kleines Demo Programm senden.

Und ja ich weiß, ich habe auch in der pdf geschaut. Aber von Demo ist da auch nichts.

Gruß Frank
golf
Benutzer
Avatar
Geschlecht:
Herkunft: Donauwörth
Alter: 73
Beiträge: 267
Dabei seit: 11 / 2009
Betreff:

Re: Process oder Task

 · 
Gepostet: 24.06.2026 - 06:15 Uhr  ·  #2
Hallo Frank, mit einer Demo kann ich auch nicht dienen, aber reicht für die UART Abfrage nicht ein Timerinterrupt alle 300 msec ?

golf
tdeck
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 54
Beiträge: 6
Dabei seit: 05 / 2026
Betreff:

Re: Process oder Task

 · 
Gepostet: 24.06.2026 - 13:42 Uhr  ·  #3
Hallo Frank,

hatte Dir gerade schon geschrieben.
Demo kenne ich auch keines. Aber die Info von Gunter ist dabei "Gold" wert.

Damit habe ich mein System komplett aufgesetzt, hier mal ein paar Infos von meinem Projekt, wie es aktuell aufgebaut ist:

Code

from System import Processes, Tasks, ....
....

  SysTick                = 10;                 // msec 
  StackSize              = 256, iData;   // Wichtig wird vom Main Process benutzt
  FrameSize              = 512, iData; // Wichtig wird vom Main Process benutzt 
  Scheduler              = iData; 
  TaskStack              = 256, iData; 
  TaskFrame              = 256; 
....






Wenn Du Prozesse benutzt immer am Ende "Schedule" benutzen, damit die restliche Zeit direkt von einen anderen Process benutzt werden kann.

Beispiel, hier lese die 4 möglichen Ausweisleser an unserer Steuerung:

Code
process ControlJobZKS(128, 180 : iData; 1, suspended); 
begin
  
  
 // V1.1965 wenn Basic, dann keine Ausweisleserabfrage keine RS485 vorhanden 
 
    if  not IO.IN_BASIC then 
  
      // wenn ein Leser aktiv ist dann Go 
      // 
      if (isSysTimerZero(ZKSTimerStart)) and (CfgLeser[1].bAdr <> 0) or (CfgLeser[2].bAdr <> 0) or (CfgLeser[3].bAdr <> 0) or (CfgLeser[4].bAdr <> 0) then 
        ReadZKSProcess;// Wenn Ausweisleser vorhanden 
      endif; 

  endif;
  
  // Process ControllZähler 

  inc(iTask_ZKSCount);
 
  Schedule;   // Nichts mehr zu tun...  dann sofort Rechenleistung freigeben. 
end; 



Mein Display habe ich in 2 Teile geteilt, da nicht immer alles ständig refresht werden muss:
Code
//-------------------------------------------------------------- 
// Display Process oberers Menue und Statusbereich; 
//-------------------------------------------------------------- 
process LCD_Displ(256, 384 : iData; 5);  {Stacksize = 256 bytes, Framesize = 384 bytes, 5 Systicks} 
begin
  WDTrig;// WatchDog Trriggern wenn eingeschaltet 
  
  ...
  DispMenu2;       // Menue im LCD-Unit aufrufen 
  
  // Process ControllZähler
  inc(iLCD_DisplCount);
  
  Schedule;       // Rechenzeit freigeben V1.1966
  
end LCD_Displ; 


In meiner Steuerung habe ich ein Status eingebaut um auch zu erkennen, wenn ein FRAME oder STACK kritisch ist oder es einen Überlauf gab.

Einfach einen Task erzeugen, der alle x Ticks aufgerufen wird und die Daten zieht, diese Daten dann in eine PIPE. Im Main Process dann einfach die Pipe abfragen und evtl. Daten holen.

Ahand der Systicks kannst Du sehr genau steuern wie oft der Task gesteuert wird. ABER WICHTIG, ein TASK darf NUR max. einen SysTick brauchen, sonst gibt es Probleme. Also nur Daten checken, in die Pipe und fertig. Keine Schleifen oder sowas machen.
Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
miparo
PowerUser
Avatar
Geschlecht:
Herkunft: Germany
Alter: 60
Beiträge: 1017
Dabei seit: 09 / 2007
Betreff:

Re: Process oder Task

 · 
Gepostet: 24.06.2026 - 13:53 Uhr  ·  #4
Hi Frank,
idealer geht das in einen Process mit WaitPipe(RxUart...), das verbraucht dann kaum Rechenzeit.
Dann brauchst du auch keinen Timer usw , da dein Process benachrichtigt wird, sollte was am UART reinkommen, solange pennt der.

Gruß
miparo
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Re: Process oder Task

 · 
Gepostet: 25.06.2026 - 09:23 Uhr  ·  #5
Guten morgen, sorry das ich jetzt erst Antworte.

Ich zeige euch mal mein Code
und ich muss sagen ja er geht zum teil aber da stimmt noch etwas nicht
weil ich öfters mal NewPosAvailable = true; bekomme aber keine Daten habe
NewPosString ist leer.
Unten, Schedule; habe ich jetzt drin aber noch nicht getestet.

Code

Process ReadSerialF0(64, 64 : iData);
var ch   : char;
Begin
    Empf_Str_F0:= '';
    WaitPipe(RXBufferF0);   //Warte auf Daten
    //warte bissel bis Buffer voll ist
    mDelay(20); //<=========
    Read(SerInpF0, Temp);
    if Temp = '<' then
      Empf_Str_F0 := Temp;
      Repeat
        if SerStatF0 then
          ch:= SerInpF0;
          Empf_Str_F0:= Empf_Str_F0 + ch;
        endif;
      until not SerStatF0;
    endif;
    NewPosString:= Empf_Str_F0;
    NewPosAvailable := true;
    count := 0;
    Schedule;
end  ReadSerialF0;





Gruß Frank
miparo
PowerUser
Avatar
Geschlecht:
Herkunft: Germany
Alter: 60
Beiträge: 1017
Dabei seit: 09 / 2007
Betreff:

Re: Process oder Task

 · 
Gepostet: 25.06.2026 - 12:49 Uhr  ·  #6
Moin Frank,
du bist ja wieder sehr spärlich mit Infos, wie groß ist dein CMD String hat der kein Stopzeichen ...?

Ein Lock/Unlock ....

Delay im Process :(

miparo
TheBeginner
Schreiberling
Avatar
Geschlecht: keine Angabe
Herkunft: Wunsiedel Bayern
Alter: 69
Beiträge: 797
Dabei seit: 06 / 2013
Betreff:

Re: Process oder Task

 · 
Gepostet: 25.06.2026 - 15:13 Uhr  ·  #7
Hallo miparo,
ich habe den process raus gehauen, das geht auch so mit einfacher If SerStat.
Und ja ich bekomme einen String mit Anfang < und Ende >

Und das Frage ich jetzt ab.
Alles in Ordnung.

Code

if bool = true then
  if SerStatF0 then
    Empf_Str_F0:= '';
    Read(SerInpF0, Temp);
    if Temp = '<' then
      Empf_Str_F0 := Temp;
      Repeat
        if SerStatF0 then
          Temp:= SerInpF0;
          Empf_Str_F0:= Empf_Str_F0 + Temp;
        endif;
      until Temp = '>';
    endif;
    NewPosString:= copy(Empf_Str_F0, 1, 48);
    ParseFluidString;
    NewPosAvailable := false;
  endif;
endif;



Gruß Frank
Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 61
Beiträge: 2175
Dabei seit: 03 / 2003
Betreff:

Re: Process oder Task

 · 
Gepostet: 25.06.2026 - 16:52 Uhr  ·  #8
Das ist nichts anderes, als mein Einlesen von GPS-Daten ....
Code

Process ReadGPS($100,$200:iData);
  Begin
    WaitPipe(RXBufferE0);                             // wait buffer
    Read(SerInpE0, Temp);                             // read buffer
    If Temp='$'                                       // if sign='$' (begin of GP-sentence)
      then
        Read(SerInpE0, Temp6);
        If Temp6 = 'GPGGA,'
          then
            Read(SerInpE0, NMEA.UTCTime,',');         // GSP time in UTC hhmmss.sss


Code

WaitPipe(RXBufferE0);                           
Read(SerInpE0, Temp);                          
    If Temp='>' then                                  
      Read(SerInpE0, Daten,'<');
  • 1
  • 2
  • Seite 1 von 2
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: 14 · Cache Hits: 14   140   154 · Page-Gen-Time: 0.028099s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI