kramann.info
© Guido Kramann

Login: Passwort:










Archiv
2 SoSe2022
..2.1 MIK
..2.2 SRT
..2.3 HDL
..2.4 AUT
..2.5 SLE
2 WS2020_21
..2.1 RTS
....2.1.1 day_by_day
..2.2 IE
....2.2.1 day_by_day
..2.3 ES
..2.4 EFSEE
....2.4.1 day_by_day
..2.5 KF
....2.5.1 day_by_day
....2.5.2 Haikus
....2.5.3 Haikus_en
..2.6 CC
....2.6.1 day_by_day
2 WS2021_22
..2.1 RTS
....2.1.1 day_by_day
....2.1.2 Versuch002
....2.1.3 Versuch003
....2.1.4 Versuch004
....2.1.5 Versuch005
....2.1.99 Material
..2.2 FTS
....2.2.1 day_by_day
..2.3 ESY
....2.3.1 day_by_day
..2.4 INFmecha5
....2.4.1 day_by_day
..2.5 REGmecha5
....2.5.1 day_by_day
2 WS2023_24
..2.1 day_by_day_RST
..2.2 day_by_day_SRT
..2.3 day_by_day_FTS
..2.4 day_by_day_KF
3 SoSe2021
..3.1 STR
....3.1.1 day_by_day
..3.2 SLE
....3.2.1 day_by_day
..3.3 HDL
....3.3.1 day_by_day
..3.4 MIK
....3.4.1 day_by_day
3 SoSe2024
..3.1 Mik_21_03_2024
..3.2 Mik_04_04_2024
..3.3 Mik_11_04_2024
..3.4 Mik_18_04_2024
..3.5 Mik_25_04_2024
..3.6 Mik_02_05_2024
..3.7 Mik_16_06_2024
..3.8 Mik_23_05_2024
..3.9 Mik_30_05_2024
..3.10 Mik_05_06_2024
..3.11 Mik_13_06_2024
3 WS2022_23
..3.1 day_by_day_RST_3MB
..3.2 day_by_day_RT2_5MT
..3.3 day_by_day_EMB_7MT
..3.4 day_by_day_ABP_7MT
..3.5 day_by_day_FTS_MMB
..3.6 day_by_day_KF
4 SoSe2023
..4.2 RTS_day_by_day
..4.3 MIK_day_by_day
..4.4 AUT_day_by_day
..4.5 HDL_day_by_day
4 WS2024_25
..4.1 ING_day_by_day
....4.1.1 ING_Do_26_09_2024
....4.1.2 ING_Do_10_10_2024
....4.1.3 ING_Do_17_10_2024
....4.1.4 ING_Do_24_10_2024
....4.1.5 ING_Do_07_11_2024
....4.1.6 ING_Do_14_11_2024
....4.1.7 ING_Do_21_11_2024
....4.1.8 ING_Do_28_11_2024
....4.1.9 ING_Do_05_12_2024
....4.1.10 ING_Do_12_12_2024
....4.1.11 ING_Do_19_12_2024
..4.2 INF_day_by_day
....4.2.1 INF_Fr_27_09_2024
....4.2.2 INF_Fr_04_10_2024
....4.2.3 INF_FR_18_10_2024
....4.2.4 INF_Fr_25_10_2024
....4.2.5 INF_Fr_08_11_2024
....4.2.6 INF_Fr_15_11_2024
....4.2.7 INF_Fr_22_11_2024
....4.2.8 INF_Fr_29_11_2024
....4.2.9 INF_Fr_06_12_2024
....4.2.10 INF_Fr_13_12_2024
....4.2.11 INF_Fr_20_12_2024
....4.2.12 INF_Fr_10_01_2025
..4.3 FTS_day_by_day
....4.3.1 FTS_Mi_25_09_2024
....4.3.2 FTS_Mi_02_10_2024
....4.3.3 FTS_Mi_09_10_2024
....4.3.4 FTS_Mi_16_10_2024
....4.3.5 FTS_Mi_23_10_2024
....4.3.6 FTS_Mi_30_10_2024
....4.3.7 FTS_Mi_06_11_2024
....4.3.8 FTS_Mi_13_11_2024
....4.3.9 FTS_Mi_20_11_2024
....4.3.10 FTS_Mi_27_11_2024
....4.3.11 FTS_Mi_04_12_2024
....4.3.12 FTS_Mi_11_12_2024
....4.3.13 FTS_Mi_18_12_2024
6 Ing
..6.1 Bauplan
....6.1.1 Bootstick
....6.1.2 Xubuntu
....6.1.3 Webserver
....6.1.4 Hotspot
....6.1.5 Videostream
....6.1.6 Lampe
....6.1.7 Chassis
....6.1.8 Akku
....6.1.9 Motore
....6.1.10 Laborsteckboard
....6.1.11 Antriebstest
7 007
..7.1 Einschalten
..7.2 Vorversuche
kramann.info
© Guido Kramann

Login: Passwort:




Inhalte zur Vorlesungswoche #12, Entwicklung fehlertoleranter Software für eingebettete Echtzeitsysteme im Wintersemester 2024/25

(EN google-translate)

(PL google-translate)

Beschäftigung im Falle einer Verspätung:
  • Lassen Sie sich den Holzschrank aufschließen.
  • Arbeiten Sie an Ihrem Projekt.
  • Schauen Sie sich meine Beurteilungskriterien noch einmal an.
  • Konkretisieren Sie Ihr Projektthema, auch im Hinblaich darauf, welche Fehlertoleranzpattern zum Einsatz kommen können.

Themen heute:

  1. Callback-Funktionen
  2. Nebenläufige Prozesse in Java
  3. Fortsetzen der Projektarbeit

Zu Beginn der Lehrveranstaltung, jaetzt, in der zweiten Hälfte des Semesters, werden Themen vertieft, die Sie bei der Bewältigung Ihrer Projektarbeit unterstützen können.

1 Callback-Funktionen

Sie müssen mit Callback-Funktionen umgehen. Ein genauerer Blick darauf sollte Ihnen mehr Sicherheit beim Umgang geben und ein Überblick über die vordefinierten Callback-Funktionen in Processing sollte Ihnen mehr Möglichkeiten für die Programmentwicklung eröffnen.

Eine Auswahl an vordefinierten Callback-Methoden in Java/Processing:

  • keyPressed() ... reagieren auf Tasten des Keyboards
  • mouseClicked() ... reagieren auf Mausklicks
  • mouseMoved() ... reagieren auf Mausbewegungen
  • receive() ... reagieren auf empfangene Datenpakete über WiFi (UDP-Protokoll)
  • noteOn() ... reagieren auf ein "spiele-Ton-Ereignis" im Zusammenhang mit MIDI (Bibliothek TheMidibus)
  • ...

Man muss sich das so vorstellen, dass vereinbart ist, dass eine bestimmte Objektmethode, auf die der Anwendungsprogrammierer in der Regel keinen Zugriff hat, automatisch beim Auftreten bestimmter Ereignisse eine Call-Backmethode eines bestimmten Namens aufruft, wenn diese vom Anwendungsprogrammierer bereit gestellt wird. Das Auslösen des Aufrufs kann über einen Softwareinterrupt erfolgen, oder zyklisch über einen nebenläufigen Prozess (s.u.) geregelt sein.

Dabei ist wichtig, dass der Kopf dieser Methode (Name Case-sensitiv, Übergabeparameter, Rückgabeparameter) exakt mit der vereinbarten übereinstimmt, damit sie dann auch automatisch aufgerufen wird.

Im besten Fall kann der Anwendungsprogrammierer allgemein bestimmen, in welcher eigenen Klasse er die Callbackmethode unterbringt. In diesem Fall wird ein Objekt dieser Klasse bei dem fremden Aufrufer-Objekt registriert, beispielsweise, indem dem Konstruktor der fremden Klasse eine Referenz auf das eigene Objekt übergeben wird. Ein Beispiel dazu findet sich in der Klasse DoppelIMU, die auch in dem Projekt Taichinification von letzte Woche verwendet wurde:

import hypermedia.net.*;

public class DoppelIMU
{
...
//eigener Konstruktor:
    public DoppelIMU(String ip, int port, int port2)
    {
        this.ip = ip;
        this.port = port;
        this.port2 = port2;
        udp = new UDP( this, 6000 ); //Übergabe der Referenz auf das eigene Objekt mit "this"
        udp.listen( true );
      
    }
...
//Callback-Methode, die vom udp-Objekt aufgerufen wird:
  public void receive( byte[] data, String ip, int port ) 
  {
    ...    
  }
...

Code 0-1: Registrierung des eigenen Objekts bei dem UDP-Objekt.

Oft in Processing muss aber das Objekt mit der Callback-Methode vom Typ PApplet sein. Das ist die Basisklasse, von dem jedes Projekt bei Processing erbt und das das Überschreiben der Methoden setup() und draw() erlaubt.

In den Beispielen zu den Libraries finden Sie stets einfache Beispiele dazu, wie mit den jeweiligen Callbackmethoden umgegangen wird:

  • Datei->Beispiele->Basics->Input
  • Datei->Contributed Libraries->UDP->udp
  • Datei->Contributed Libraries->TheMidiBus

...aber auch auf den Referenz-Seiten von processing.org:

https://processing.org/reference/keyCode.html
https://processing.org/reference/mouseClicked_.html
  • Um Callback-Methoden selber schreiben zu können, ist eine Kenntnis von Reflections notwendig, die hier nicht thematisiert wird.
  • Da Sie jedoch alle Ihre selbst geschriebenen Klassen kennen, benötigen Sie das nicht, sondern können statt dessen "ohne Umweg" die Methoden eines Objekts beispielsweise von einer Thread-Methode aus (s.u.) aufrufen.

2 Nebenläufige Prozesse in Java

Nebenläufige Prozesse, so genannte Threads, bieten eine elegante Möglichkeit Codeelemente voneinander getrennt zu halten. So kann ein Faultobserver nebenläufig als paralleler Prozess laufen und bestimmte Vorgänge überwachen, ohne dass ein sichtbarer Aufruf in einem anderen Programmteil zu sehen ist. Jedoch können durch Zugriff auf die gleichen Ressourcen durch mehrere parallel laufende Prozesse auch Programmabläufe korrumpiert werden. Hier gilt es, Maßnahmen zu ergreifen, die das verhindern, wie beispielsweise Methoden mit dem Zusatz synchronized zu versehen.


Fähigkeiten der Klasse Thread: 36_Java/04_Threads

Gängige Methode zur Implementierung eigener nebenläufiger Prozesse (mit Schnittstelle Runnable): 77_Android/04_Threads

Verwendung des Modifikators synchronized: 67_Echtzeitsysteme/02_Threads/02_Synchronisierung


Im Unterricht werden noch einfache Programmbeispiele entwickelt werden und nachfolgend hochgeladen.


Beispiel zur Erzeugung eines eigenen nebenläufigen Prozesses


Neben meinProzess;
public void setup()
{
    frameRate(5);
    meinProzess = new Neben();
}

public void draw()
{
     println("Hauptprozess");
}

public void keyPressed()
{
     meinProzess.toggle();
}

Code 0-2: Haupttab -- Beispiel zur Erzeugung eines eigenen nebenläufigen Prozesses

public class Neben implements Runnable
{
     boolean aktiv = false;
  
     public Neben()
     {
         (new Thread(this)).start();
     }
  
     public void toggle()
     {
          aktiv = !aktiv;
          println("jetzt aktiv=="+aktiv);
     }
  
     public void run()
     {
         while(true)
         {
              try
              {
                  Thread.sleep(200);
              }
              catch(Exception e)
              {
              }
              if(aktiv) println(".....nebenläufiger Prozess");
         }
     }
}

Code 0-3: Tab mit eigener Klasse -- Beispiel zur Erzeugung eines eigenen nebenläufigen Prozesses

Nutzung eines nebenläufigen Prozesses als Fault-Observer


Neben meinProzess;
public void setup()
{
    frameRate(5);
    meinProzess = new Neben();
}


boolean autopilot_running =false;
public synchronized void  autopilot(boolean start)
{
     autopilot_running = start;
     println("Autopilot=="+autopilot_running);
}

public void draw()
{
     println("Hauptprozess");
}

public void keyPressed()
{
     meinProzess.update();
}

Code 0-4: Haupttab -- Nutzung eines nebenläufigen Prozesses als Fault-Observer

public class Neben implements Runnable
{
  
     public Neben()
     {
         (new Thread(this)).start();
     }

     /**
     wird von zyklischem Prozess aufgerufen, dient zum Überprüfen des Zeitintervalls in dem
     der betreffende Prozess aufgerufen wird
     */
     long T=System.currentTimeMillis();
     public void update()
     {
         T=System.currentTimeMillis();
     }
  
     public void run()
     {
         while(true)
         {
              try
              {
                  Thread.sleep(200);
              }
              catch(Exception e)
              {
              }
              if(System.currentTimeMillis()-T>2000)
              {
                 println("WARNUNG: Zeitüberschreitung");
                 autopilot(true);
              }
         }
     }
}

Code 0-5: Tab mit eigener Klasse -- Nutzung eines nebenläufigen Prozesses als Fault-Observer

3 Fortsetzen der Projektarbeit

  • Abfrage und Erinnerung der Möglichkeit das Projekt zur Präsentation vor Schüler*Innengruppen zu nutzen.