Process- und Task-System

  • 1
  • 2
  • Page 1 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Process- und Task-System

 · 
Posted: 08.04.2021 - 15:29  ·  #1
Hallo Leute,

ich habe in meiner aktuellen Steuerung das Process- und Task-System vom AVRco im Einsatz.

Im Define habe ich:
Code
define
  OSCtype = int2MHz, PLLmul = 31, prescB = 1, prescC = 1, overdrive; // 62 MHz 
...
  SysTick = 10; // msec 
...


Meine Hauptroutine liegt im Main:
Selbst definierte Tasks/Processe (ohne evtl. Treiber) sind:
Code
Process Main loop
Task ControlJob(iData, resumed);
process USB_RxTx (256, 512 : iData );
process LCD_Displ(256, 384 : iData; 5);
process LCD_DisplBott(180, 384 : iData; 5); 
process ControlJobZKS(128, 180 : iData; 1, suspended);


Um zu schauen wie oft die Hauptroutine durchlaufen wird, nutze ich einen Zähler der nach jeder Sekunde die Anzahl sichert und wieder auf 0 setzt.

Auch wenn ich die Steuerung unterschiedlich beanspruche erhalte ich immer 100 Durchläufe/Zyklen pro Sekunde.

Mich wundert hier die immer genaue "100", ich würde gerne verstehen, warum diese Anzahl mit 100 wie "Stein gemeiselt" steht?

Kann mir das Jemand erklären?

Klar ein Process kann unterbrochen werden, für Tasks usw., aber ich habe in dieser Routine rund 3.000 Programmzeilen, die nicht immer alle abgearbeitet werden. Viele werden nur alle 50 oder 100 Zyklen durchlaufen oder es gibt auch viele IF Anweisungen. Wenn die Bedingungen nicht erfüllt sind, dann müsste der Zyklus doch öfter durchlaufen, oder? Aber die "100" stehen immer!

Thorsten
Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Re: Process- und Task-System

 · 
Posted: 08.04.2021 - 17:24  ·  #2
Hallo Thorsten,

ich würde sagen 10ms * 100 = 1s ;) ..... oder 1s : 0.01s = 100

Harry
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Process- und Task-System

 · 
Posted: 08.04.2021 - 17:38  ·  #3
Quote by Harry

Hallo Thorsten,

ich würde sagen 10ms * 100 = 1s ;) ..... oder 1s : 0.01s = 100

Harry


Hallo Harry,

das ist grundsätzlich schon klar.

Aber die anderen Processe werden auch mit "Schedule;" freigegeben oder wenn nichts zu tun ist sofort mit "Schedule;" beendet.

Und wenn ich das so rechne, woher nehmen dann die anderen Processe / Tasks ihre Rechenzeit?
Oder läuft es so optimal, das ich diese anderen Unterbrechungen einfach nicht merke?

Thorsten
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Process- und Task-System

 · 
Posted: 08.04.2021 - 22:54  ·  #4
Hallo Thorsten,
ich blicke da nicht durch.

Quote
Process Main loop
Task ControlJob(iData, resumed);


heisst das, du hast einen Prozess namens "Main" definiert ?
Und darin definierst du andere Prozesse und einen Task?
Und der letzte Prozess hat Prio 1?

Wie ist denn die Struktur der Hauptroutine mit dem Zähler?

Gunter
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Process- und Task-System

 · 
Posted: 09.04.2021 - 11:21  ·  #5
Quote by Gunter

Hallo Thorsten,
ich blicke da nicht durch.

Quote
Process Main loop
Task ControlJob(iData, resumed);


heisst das, du hast einen Prozess namens "Main" definiert ?
Und darin definierst du andere Prozesse und einen Task?
Und der letzte Prozess hat Prio 1?

Wie ist denn die Struktur der Hauptroutine mit dem Zähler?

Gunter


Hallo Gunter,

Code
Process Main loop
Task ControlJob(iData, resumed);
process USB_RxTx (256, 512 : iData );
process LCD_Displ(256, 384 : iData; 5);
process LCD_DisplBott(180, 384 : iData; 5); 
process ControlJobZKS(128, 180 : iData; 1, suspended);


Lt. Handbuch "..läuft das Hauptprogramm (Main) ebenfalls als Prozess und hat auch eine Priorität...."
Somit läuft die Main loop ebenfalls als Process und wenn keine Angabe gemacht wird erhält dieser automatisch die Prio 5, also erhält er max. 5 SysTicks Zeit zur Bearbeitung am Stück und wird nur durch Tasks unterbrochen.

Der "Task ControlJob(iData, resumed)" wird einmal durchlaufen und sofort am ende der Routine unterbrochen.

Folgenden Prozesse werden einmal durchlaufen und am ende wird die Rechenzeit sofort mit Shedule freigegeben:
Code
process  USB_RxTx (256, 512 : iData );
process LCD_Displ(256, 384 : iData; 5);
process LCD_DisplBott(180, 384 : iData; 5); 
process ControlJobZKS(128, 180 : iData; 1, suspended);


Auch wenn diese teilweise 5 Ticks Zeit hätten, werden diese nach einem Durchlauf sofort beendet und freigegeben.

Die Hauptroutine wird nicht mit Shedule beendet:
Code
Process Main loop;


Wenn ich es richtig verstanden habe läuft diese dann ihre 5 Systicks durch.

Oder wird diese nach dem 1. Durchlauf automatisch per Shedule beendet? Wenn das so ist, würde es erklären, warum ich hier keine Änderung feststelle.

Hier mein Ablauf der Hauptroutine/Main
1. Prozessabbild der Eingänge, Flanken, ADC usw.
2. Evtl. Änderungen im Configbereich übernehmen und verarbeiten (EEPROM)
3. Timer- und Zählerbearbeitung
4. Programmablaufsteuerung / Hauptroutine
5. Prozessabbild der Ausgänge
6. Zähler für Zyklus um 1 erhöhen
7. Ende und damit springt er wieder an 1.

Grundsätzlich läuft das System super stabil und zuverlässig. Aber ich würde gerne das System noch etwas optimieren und zur Kontrolle habe ich mir den Zykluszähler eingebaut, damit wollte ich kontrollieren wie oft die Hauptroutine durchlaufen wird.

Thorsten
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Process- und Task-System

 · 
Posted: 09.04.2021 - 15:23  ·  #6
Hi Thorsten,

dass das Hauptprogramm ein Prozess wird ist nur eine Hintergrund Information
bei der Erklärung des funktionellen Ablaufs vom Multitasking.
Das passiert automatisch OHNE, dass es eigens als Prozess definiert wird.
Dein Main ist also nicht das Hauptprogramm, das läuft wenn sonst nix
zu tun ist, sondern ein ganz gewöhnlicher Prozess der mit der Default Prio vom
Scheduler gestartet wird.
Somit wäre die Loop sogar überflüssig !

Wenn nix zu tun ist darf dein Programm lt. Definition sogar crashen weil kein
"Idle" definiert ist. Offensichtlich passiert dies hier nicht, was aber NICHT garantiert
ist.
Schreib dein Main ganz normal wie ohne Multitasking !
Schöne Grüße,
Gunter
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Process- und Task-System

 · 
Posted: 09.04.2021 - 16:56  ·  #7
Quote by Gunter

Hi Thorsten,

dass das Hauptprogramm ein Prozess wird ist nur eine Hintergrund Information
bei der Erklärung des funktionellen Ablaufs vom Multitasking.
Das passiert automatisch OHNE, dass es eigens als Prozess definiert wird.
Dein Main ist also nicht das Hauptprogramm, das läuft wenn sonst nix
zu tun ist, sondern ein ganz gewöhnlicher Prozess der mit der Default Prio vom
Scheduler gestartet wird.
Somit wäre die Loop sogar überflüssig !

Wenn nix zu tun ist darf dein Programm lt. Definition sogar crashen weil kein
"Idle" definiert ist. Offensichtlich passiert dies hier nicht, was aber NICHT garantiert
ist.
Schreib dein Main ganz normal wie ohne Multitasking !
Schöne Grüße,
Gunter


Hallo Gunter,

ok. Wenn ich aber kein Loop mache muss ich meinen Aufbau anderst machen.

Im Moment

Ist der Aufbau der Main etwa so:
Code
{--------------------------------------------------------------}
{ Main Program } 
{$IDATA}

begin

( mache die ganzen INIT Funktionen und alles was beim ersten Start nötig ist )

///////////////////////////////////////////// 
//  LOOP START 
// 
  loop  // Main LOOP 

(ab hier sind alle Funktionen drinnen, die immer durchlaufen werden müssen. )

  endloop;   
  
end MainProg. // Ende der Unit


Wenn ich richtig verstehe müsste ich hier den LOOP und ENDLOOP entfernen.

Die ganzen INIT Sachen für den ersten Start müsste ich dann mit einen BOOLEAN gegen ein erneutes durchlaufen schützen:

Code
var
BInitReady  : boolean;
...
{--------------------------------------------------------------}
{ Main Program } 
{$IDATA}

begin

if not BInitReady then // beim erneuten Aufruf überspringe die INITs
   BInitReady:=true; // erneuten durchlaufen verhindern
     ( mache die ganze INIT Funktionen und alles was beim ersten Start nötig ist )
endif;

///////////////////////////////////////////// 
//  Process START // ALT LOOP 
// 
// MAIN Process start für Zyklus Ablauf
//
(ab hier sind alle Funktionen drinnen, die immer durchlaufen werden müssen. )

 
end MainProg. // Ende der Unit


Das würde heissen der Process läuft dann einmal durch bis zum "end MainProg", danach würde der Sheduler übernehmen und die evtl. freie Rechenzeit für andere Aufgaben nutzen. Richtig?
Oder durchläuft er immer bis seine Zeit 5x Systick erreicht ist bzw. mit "Shedule;" beendet wird.

Beim Task ist mit klar, am Ende des TASKs geht er sofort an den Sheduler zurück, beim Process ist mir das noch nicht so klar.

Quote by Gunter
...Wenn nix zu tun ist darf dein Programm lt. Definition sogar crashen weil kein
"Idle" definiert ist. Offensichtlich passiert dies hier nicht, was aber NICHT garantiert
ist.

Ja, aber er hat hier immer was zu tun, wenn er drann ist. Eingänge abfragen, Flanken erkennen usw.
Diese Funktionen sind so programmiert, das sie immer durchlaufen werden können und auch sollen.

Thorsten
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Process- und Task-System

 · 
Posted: 09.04.2021 - 16:59  ·  #8
NEIN.
Das "Process" vor Main muss weg und die LOOP muss bleiben !
  • 1
  • 2
  • Page 1 of 2
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: 14 · Cache Hits: 14   140   154 · Page-Gen-Time: 0.028959s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI