kramann.info
© Guido Kramann

Login: Passwort:










COACH2
1 Planung
2 Architektur
3 Anzeige
4 EEPROM
5 I2C
..5.1 MasterSendByte
..5.2 MasterSend2Bytes
..5.3 MasterReceiveByte
..5.4 MasterReceive2Bytes
6 UART
7 DFT
8 FFT
9 Planung2
10 Klassen
..10.1 AnzeigeTaster
..10.2 RS232
..10.3 MotorServo
..10.4 Drehgeber
..10.5 Sensor
..10.6 Funk
11 Adaption
..11.1 Programmiertechnik
..11.2 Evoopt
12 Fuzzy
..12.1 Uebungsaufgabe
..12.2 Fuzzygroesse
..12.3 Fuzzyset
..12.4 Lookuptable
13 Skript
..13.1 Funkkorrektur
..13.2 Skriptsprachen
..13.3 Anforderungen
..13.4 Agentensysteme
..13.5 Implementierung
..13.6 Experimente
14 Gesamtkonzept
..14.1 Skripterweiterung
..14.2 Makroverhalten
67 Echtzeitsysteme
..67.1 Einfuehrung
....67.1.1 Echtzeit
....67.1.2 Korrektheit
....67.1.3 Hardware
....67.1.4 Ziele
....67.1.5 Synchronprogramm
..67.2 Threads
....67.2.1 Java
....67.2.2 Synchronisierung
..67.3 COACH
....67.3.1 Kaskadenregler
....67.3.2 Zeitebene1
....67.3.3 Zeitebene2
....67.3.4 Zeitebene3
....67.3.5 Puck
....67.3.6 Puckschwarm
..67.4 RTAIlab
....67.4.1 Slax
....67.4.1 USB_Stick
....67.4.2 Sinus
..67.5 Semaphor
....67.5.1 Laufkatze
....67.5.2 Java
....67.5.3 Semaphor
..67.6 Audio
....67.6.1 wav
....67.6.2 Linux
..67.7 Lookup
....67.7.1 Fuzzy
....67.7.2 PWM
..67.8 NeuronaleNetze
....67.8.1 Neuron
....67.8.2 Backpropagation
....67.8.3 Umsetzung
....67.8.4 Winkelerkennung
..67.9 Internetprogrammierung
....67.9.1 Codegenerierung
....67.9.2 PHP_Programmierung
....67.9.3 PHP_OOP
....67.9.4 Java
....67.9.5 UDP
..67.10 DFT
..67.11 FFT
..67.12 Zustandsmaschine
..67.13 Fuzzy
....67.13.1 Fuzzylogik
....67.13.2 FuzzyRegler
....67.13.3 Uebung9
....67.13.5 Softwareentwicklung
......67.13.5.1 AgileSoftwareentwicklung
......67.13.5.2 FuzzyRegler
......67.13.5.3 Uebung
....67.13.6 Umsetzung
......67.13.6.1 FuzzyRegler
......67.13.6.2 Simulation
......67.13.6.3 Optimierung
......67.13.6.4 Uebung
....67.13.7 Haengependel
......67.13.7.1 Haengependel
......67.13.7.2 Simulation
......67.13.7.3 FuzzyRegler
......67.13.7.4 Optimierer
......67.13.7.5 Genetisch
....67.13.8 Information
....67.13.9 Energie

67.5.2 Darstellung des Synchronisierungsvorgangs von Lese- und Schreibprozessen mit Java

java_semaphor.zip - Download der nachfolgenden Java-Projekte.
  • Der für die drei Mikrocontroller A,B und C beschriebene Synchronisierungsmechanismus läßt sich auch in einem Java-Programm mit drei Threads darstellen.
  • Dabei gibt es statt der Datenleitungen zwei Arrays: arrA wird von A beschrieben und von C gelesen. arrB wird von B geschrieben und von C gelesen.
  • In arrA und arrB wird immer abwechselnd das ganze Array mit Nullen und beim nächsten Schreibzyklus mit Einsen gefüllt.
  • Sollte der Lesevorgang stattfinden, wenn der Schreibvorgang noch nicht abgeschlossen ist, so sind nicht alle Arrayzellen in gleicher Weise gefüllt (entweder nur Nullen oder nur Einsen).
  • Dies passiert, wenn die Zugriffe auf die Arrays unkontrolliert stattfinden.
  • Zunächst soll dies demonstriert werden:
public class SchreibenA extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrA[i]=1;
                else
                    Hauptprogramm.arrA[i]=0;
                Hauptprogramm.pausieren(20);
            }
            //Erledige andere Aufgaben:
            Hauptprogramm.pausieren(50);
            einser = !einser;
        }
    }
}

Code 67.5.2-1: SchreibenA.java in Projekt 001_unkontrolliert

public class SchreibenB extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrB[i]=1;
                else
                    Hauptprogramm.arrB[i]=0;
                Hauptprogramm.pausieren(20);
            }
            //Erledige andere Aufgaben:
            Hauptprogramm.pausieren(50);
            einser = !einser;
        }
    }
}

Code 67.5.2-2: SchreibenB.java in Projekt 001_unkontrolliert

public class LesenC extends Thread
{
    public void run()
    {
        while(true)
        {
            System.out.println("C  liest nun arrA aus:");
            for(int i=0;i<30;i++)
            {
                System.out.print(Hauptprogramm.arrA[i]);
                Hauptprogramm.pausieren(100);
            }
            System.out.println();
            System.out.println("C  liest nun arrB aus:");
            for(int i=0;i<30;i++)
            {
                System.out.print(Hauptprogramm.arrB[i]);
                Hauptprogramm.pausieren(100);
            }
            System.out.println();
            //Erledige andere Aufgaben:
            Hauptprogramm.pausieren(200);
        }
    }
}

Code 67.5.2-3: LesenC.java in Projekt 001_unkontrolliert

public class Hauptprogramm
{
    public static int[] arrA={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    public static int[] arrB={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    public static void pausieren(long ms)
    {
        try
        {
            Thread.sleep(ms);
        }
        catch(Exception e)
        {
        }
    }
    public static void main(String[] args)
    {
        SchreibenA schreibenA = new SchreibenA();
        SchreibenB schreibenB = new SchreibenB();
        LesenC lesenC = new LesenC();
        schreibenA.start();
        schreibenB.start();
        lesenC.start();
        pausieren(20000);
        while(lesenC==Thread.currentThread());        
        lesenC.stop();
        while(schreibenB==Thread.currentThread());        
        schreibenB.stop();
        while(schreibenA==Thread.currentThread());        
        schreibenA.stop();
    }
}

Code 67.5.2-4: Hauptprogramm.java in Projekt 001_unkontrolliert

  • In der Konsole erscheint nach Start des Programmes:
C  liest nun arrA aus:
000000000111111110000000011111
C  liest nun arrB aus:
000011111111000000001111111100
C  liest nun arrA aus:
111110000000011111111000000001
C  liest nun arrB aus:
000000001111111100000000111111
C  liest nun arrA aus:
011111111000000001111111100000
C  liest nun arrB aus:
111100000000111111110000000011

Code 67.5.2-5: Konsolenausgabe

  • Die Arrays sind somit nicht sauber zuende geschrieben worden, als die Zugriffe auf diese erfolgten.
  • Nun wird der gegenseitige Sperrmechanismus mit Hilfe boolscher Variablen ähnlich wie bei den Mikrocontrollern realisiert:
public class SchreibenA extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
          if(Hauptprogramm.CliestA==false)
          {
            Hauptprogramm.Aschreibt=true;
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrA[i]=1;
                else
                    Hauptprogramm.arrA[i]=0;
                Hauptprogramm.pausieren(20);
            }
            Hauptprogramm.Aschreibt=false;
            einser = !einser;
          } 
          //Erledige andere Aufgaben:
          Hauptprogramm.pausieren(50);
        }
    }
}

Code 67.5.2-6: SchreibenA.java in Projekt 002_kontrolliert

public class SchreibenB extends Thread
{
    public boolean einser = false;
    public void run()
    {
        while(true)
        {
          if(Hauptprogramm.CliestB==false)
          {
            Hauptprogramm.Bschreibt=true;
            for(int i=0;i<30;i++)
            {
                if(einser)
                    Hauptprogramm.arrB[i]=1;
                else
                    Hauptprogramm.arrB[i]=0;
                Hauptprogramm.pausieren(20);
            }
            Hauptprogramm.Bschreibt=false;
            einser = !einser;
          } 
          //Erledige andere Aufgaben:
          Hauptprogramm.pausieren(50);
        }
    }
}

Code 67.5.2-7: SchreibenB.java in Projekt 002_kontrolliert

public class LesenC extends Thread
{
    public void run()
    {
        while(true)
        {
          if(Hauptprogramm.Aschreibt==false)
          {
            Hauptprogramm.CliestA=true;
            System.out.println("C  liest nun arrA aus:");
            for(int i=0;i<30;i++)
            {
                System.out.print(Hauptprogramm.arrA[i]);
                Hauptprogramm.pausieren(100);
            }
            System.out.println();
            Hauptprogramm.CliestA=false;
          }
          if(Hauptprogramm.Bschreibt==false)
          {
            Hauptprogramm.CliestB=true;
            System.out.println("C  liest nun arrB aus:");
            for(int i=0;i<30;i++)
            {
                System.out.print(Hauptprogramm.arrB[i]);
                Hauptprogramm.pausieren(100);
            }
            System.out.println();
            Hauptprogramm.CliestB=false;
          }
          //Erledige andere Aufgaben:
          Hauptprogramm.pausieren(200);
        }
    }
}

Code 67.5.2-8: LesenC.java in Projekt 002_kontrolliert

public class Hauptprogramm
{
    public static int[] arrA={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    public static int[] arrB={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
    public static boolean Aschreibt = false;
    public static boolean Bschreibt = false;
    public static boolean CliestA   = false;
    public static boolean CliestB   = false;
    public static void pausieren(long ms)
    {
        try
        {
            Thread.sleep(ms);
        }
        catch(Exception e)
        {
        }
    }
    public static void main(String[] args)
    {
        SchreibenA schreibenA = new SchreibenA();
        SchreibenB schreibenB = new SchreibenB();
        LesenC lesenC = new LesenC();
        schreibenA.start();
        schreibenB.start();
        lesenC.start();
        pausieren(30000);
        while(lesenC==Thread.currentThread());        
        lesenC.stop();
        while(schreibenB==Thread.currentThread());        
        schreibenB.stop();
        while(schreibenA==Thread.currentThread());        
        schreibenA.stop();
    }
}

Code 67.5.2-9: Hauptprogramm.java in Projekt 001_unkontrolliert

C  liest nun arrA aus:
111111111111111111111111111111
C  liest nun arrB aus:
111111111111111111111111111111
C  liest nun arrA aus:
000000000000000000000000000000
C  liest nun arrB aus:
000000000000000000000000000000

Code 67.5.2-10: Konsolenausgabe

  • Nun tritt der Fall nicht mehr auf, dass die Arrays ausgelesen werden, wenn sie nicht fertig beschrieben wurden.
  • Allerdings läuft das Programm nun auch langsamer.