Processe und Tasks...Mainprocess

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

Processe und Tasks...Mainprocess

 · 
Posted: 14.09.2014 - 17:15  ·  #1
Hallo Leute,

sobald ich Processe und Tasks verwende, wird aus der Main ja ein Process.

Da ich aktuell Probleme mit dem USBsmart habe, bin ich auf der Suche zur Optimierung.

In einem Process kann ich ja mit LOCK(Processname) ...UNLOCK(Processname) das unterbrechen zwischen den beiden Punkten verhindern.

Wie kann ich das aber in dem MAIN-Process machen? Ich hab es schon versucht mit LOCK(MAIN); das geht aber nicht ;) Wie mache ich das? Im Handbuch habe ich es wohl überlesen ;) oder es steht nicht drinnen :(

Durch das verstellen der Prios bekommme ich Probleme auf meinen I2C Funktionen und möchte diese gerne mit LOCK sichern.

Hab es gefunden steht bei dem Multitaskingfunktionen, "LOCK( Main_Proc )", hatte nur bei den Processen und Tasks geschaut :)

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Processe und Tasks...Mainprocess

 · 
Posted: 14.09.2014 - 17:25  ·  #2
Hallo Thorsten,

das Main kann man nur mit Lock/Unlock(self) bearbeiten.
Ist allerdings gefährlich wenn kein Idle-Process importiert wurde.

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

Re: Processe und Tasks...Mainprocess

 · 
Posted: 14.09.2014 - 18:33  ·  #3
Quote by rh

Hallo Thorsten,

das Main kann man nur mit Lock/Unlock(self) bearbeiten.
Ist allerdings gefährlich wenn kein Idle-Process importiert wurde.

rolf

Hallo Rolf,

ok, aber kann das überhaupt passieren?

Code
 loop   // Main LOOP

 //ziehe Hardware Eingänge

  LOCK( MAIN_PROC );
   ReadInput; // Lese Eingangsspeicher
   UNLOCK( MAIN_PROC );
   
    SysLEDflashOn( 0 ); // OKLED; // Zyklus LED starten

  LOCK( MAIN_PROC );
      DebugPrinting;
   UNLOCK( MAIN_PROC );

       Tuer; // Tür Funktionen

  LOCK( MAIN_PROC );
     WriteOutput; // Schreibe Ausgänge zur Hardware
   UNLOCK( MAIN_PROC );

  WatchDogTrig;
 endloop;


Ich möchte nur verhindern, das beim Lesen und Schreiben der I2C und der Ser.-Debugausgabe ein Process/Task dazwischen funkt.

Wenn ich das richtig verstanden habe, wäre das nur nötig wenn ich alle TASKs / Processe einschl. des Main_Prc schlafen oder in Wartefunktion lege oder?

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Processe und Tasks...Mainprocess

 · 
Posted: 14.09.2014 - 20:36  ·  #4
Hallo Thorsten,

Lock/Unlock(process/task) sperrt keine Interrupts sondern verhindert nur dass der
Scheduler hier zum nächsten Prozess oder Task umschaltet. Ist beim USB etwas
gefährlich, da der ControlJob ja mindestens alle 50msec kommen muss. Dauert das
Lock bzw. die darin aufgerufene Funktion länger als 50msec schaltet der PC diese
USB Schnittstelle ab und das Handle im PC Programm wird ungültig.

Natürlich ist beim Lock kein Idle Prozess notwendig.

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

Re: Processe und Tasks...Mainprocess

 · 
Posted: 14.09.2014 - 23:36  ·  #5
Quote by rh

Hallo Thorsten,

Lock/Unlock(process/task) sperrt keine Interrupts sondern verhindert nur dass der
Scheduler hier zum nächsten Prozess oder Task umschaltet. Ist beim USB etwas
gefährlich, da der ControlJob ja mindestens alle 50msec kommen muss. Dauert das
Lock bzw. die darin aufgerufene Funktion länger als 50msec schaltet der PC diese
USB Schnittstelle ab und das Handle im PC Programm wird ungültig.

Natürlich ist beim Lock kein Idle Prozess notwendig.

rolf


Hallo Rolf,
aber ich denke es ist auch nicht sonderlich gut, wenn der Task das lesen und vor allen das schreiben auf dem I2C Bus unterbricht oder?

Die Lese- und Schreibroutinen habe ich so aufgebaut, das keine Schleifen vorhanden sind, er rutscht quasi einmal von oben nach unten durch und fertig, danach kann der TASK ja sofort übernehmen.

Aber ich bin mittlerweile schon am überlegen, ob ich das nicht mal selbst in die Hand nehme, in etwa so:

Loop
USB_Task
ReadInput I2C
USB_Task
Debugausgabe
USB_Task
USB_RX_TX
USB_Task
TuerCtrl
USB_Task
WriteOutput I2C
endloop

Klar wird der USB_task dann viel zu oft aufgerufen ;) aber so stelle ich auf jedenfall sicher, das er innerhalb von 50ms kommt und keine andere Routine unterbrochen wird.
Delays gibt es bei mir nur beim INIT oder Fehler, deswegen rennen alle Programmteile komplett durch.

Es wäre mal ein Versuch wert.

Die Einstellungen der TASKs und der Processe sind etwas Tricky und man muss wohl immer wieder nachbessern :(

Aber das Problem mit dem USBsmart bekomme ich mit den anderen Programmteilen nicht zuverlässig zum laufen. Das ist schlimme ist, ich bin noch nicht mal fertig mit meinem Programmen. Da kommt noch mehr rein....

Gruß
Thorsten
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Processe und Tasks...Mainprocess

 · 
Posted: 15.09.2014 - 17:13  ·  #6
Hallo Thorsten,

natürlich kann man den ControlJob zyklisch aufrufen. Da besteht allerdings
das Problem dass der Prozess (z.B. Main) ja auch nur alle xx SysTicks dran
kommt. Eine wesentlich sichere Alternative ist wenn man den ControlJob
durch einen Ticktimer Interrupt durchführt, z.B. alle 20msec. Da kann dann
nur noch eine länger dauernde Interrupt Sperrung dazwischen funken.

Viele Wege führen nach Rom. Je komplexer die ganze Anwendung ist, desto
komplexer wird das ganze Handling, vor allem bei Prozessen und Tasks.

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: 14   111   125 · Page-Gen-Time: 0.026142s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI