Nach der Hardware nun die Software

Nachdem der Hardware-Zusammenbau recht problemlos verlief und die ersten kleinen Softwaretest sehr vielversprechend waren, musste natürlich en kleines System entwickelt werden:

Auf dem PC erfragt ein Turbopascalprogramm einen Endwert und sendet diesen an Transputer A.

Dieser startet mit dem Wert 0, addiert eins dazu und sendet diesen Wert an Transputer C

Transputer C erhöht den Wert um eins und sendet diesen Wert an Transputer D.

Transputer D erhöht den Wert um eins und sendet diesen Wert an Transputer B.

Transputer B erhöht den Wert um eins und sendet diesen Wert an Transputer C.

Transputer C erhöht den Wert um eins und sendet diesen Wert an Transputer B.

Transputer B erhöht den Wert um eins und sendet diesen Wert an Transputer A.

Transputer A erhöht den Wert um eins und sendet diesen Wert an Transputer D.

Transputer D prüft, ob der Endwert erreicht wurde und sendet die verbrauchte Zeit an das Turbopascalprogramm zurück und sagt den anderen Transputern bescheid, die Schleife zu beenden.

Wahrlich kein wirklich sinnvolles Programm, aber damit lässt sich die gesamte Hardware und ein kleiner Teil des Softwareinterfaces testen.

Druck

Das Turbopascalprogramm fällt recht kurz aus:

program ring;

uses LinkLib;

var Endwert:longint;
    Zeit:single;

begin
  writeln('Ringleitung:');
  writeln('   Es wird ein Wert solange herumgeschickt');
  writeln('   und um eins erhöht, bis der Endwert erreicht ist!');

  Endwert:=0;
  repeat
    write('Endwert (1.000 ... 10.000.000) ?'); readln(Endwert);
  until (Endwert>=1000)and(Endwert<=10000000);

  writeln('+++ Es geht los +++');
  Int32ToLink(Link1,Endwert);
  writeln;

  Int32FromLink(Link2, Endwert);
  Real32FromLink(Link2, Zeit);

  write('Ringlaufzeit :');
  write(' Dauer:',Zeit:6:2,' Sekunden., ');
  write(Endwert ,' Wörter.');
  writeln(' Rate :',Endwert*4/Zeit:10:2,' Bytes pro Sekunde.')

end.

Auch die Occamprogramme sind nicht wirklich aufwändig:

PROC PlusEins(CHAN OF INT LOUT, LIN)
  INT Wert:
  SEQ
    LIN ? Wert
    LOUT ! Wert
    LIN ? Wert
    WHILE Wert >= 0
      SEQ
        LOUT ! Wert + 1
        LIN ? Wert
    LOUT ! Wert
:

Auf den Transputern B und C laufen jeweils zwei "+1"-Prozesse:

#USE "PlusE000.tsr"
PROC PlusEinsTwice(CHAN OF INT LOUT1, LIN1, LOUT2, LIN2)
  PAR
    PlusEins(LOUT1, LIN1)
    PlusEins(LOUT2, LIN2)
:

Der Code für Transputer A:

#USE "PlusE000.tsr"
PROC Anfang(CHAN OF INT LOUT2, LIN2, LOUT1, LIN1)
  CHAN OF ANY FromHost:
  CHAN OF ANY ToHost:
  PLACE FromHost AT 4:
  PLACE ToHost AT 0:
  INT Wert:
  INT Ende:
  PAR
    SEQ
      ToHost ! (BYTE 0)
      ToHost ! (BYTE 7)
      ToHost ! (BYTE 0)
      ToHost ! (BYTE 0)
      ToHost ! (BYTE 0)
      Wert := 0
      FromHost ? Ende
      LOUT1 ! Ende
      LIN1 ? Wert
      WHILE Wert >= 0
        SEQ
          LOUT1 ! Wert + 1
          LIN1 ? Wert
      LOUT1 ! Wert
    PlusEins(LOUT2, LIN2)
:

Der Code für Transputer D:

#USE "PlusE000.tsr"
PROC Ende(CHAN OF INT LOUT2, LIN2, LOUT1, LIN1)
  PAR
    CHAN OF ANY ToHost:
    PLACE ToHost   AT 0:
    TIMER Uhr:
    INT Start:
    INT Stop:
    INT Wert:
    INT Ende:
    SEQ
      Wert := 0
      LIN1 ? Ende
      Uhr ? Start
      Wert := 0
      WHILE Wert < Ende
        SEQ
          LOUT1 ! Wert + 1
          LIN1 ? Wert
      LOUT1 ! -1 (INT)
      Uhr ? Stop
      ToHost ! Ende
      ToHost ! (REAL32 ROUND ((Stop - Start) * 64)) / 1000000.0(REAL32)
    PlusEins(LOUT2, LIN2)
:

Konfiguration der Transputerumgebung:

[8] CHAN OF INT Link:
PLACED PAR
  PROCESSOR 1 T8
    PLACE Link[ 0] AT 1:
    PLACE Link[ 5] AT 7:
    PLACE Link[ 6] AT 2:
    PLACE Link[ 7] AT 6:
    Anfang(Link[6],Link[5],Link[0],Link[7])
  PROCESSOR 2 T8
    PLACE Link[0] AT 5:
    PLACE Link[1] AT 3:
    PLACE Link[3] AT 4:
    PLACE Link[4] AT 2:
    PlusEinsTwice(Link[1],Link[0],Link[4],Link[3])
  PROCESSOR 3 T8
    PLACE Link[2] AT 5:
    PLACE Link[3] AT 0:
    PLACE Link[4] AT 6:
    PLACE Link[5] AT 3:
    PlusEinsTwice(Link[3],Link[2],Link[5],Link[4])
  PROCESSOR 4 T8
    PLACE Link[1] AT 7:
    PLACE Link[2] AT 1:
    PLACE Link[6] AT 6:
    PLACE Link[7] AT 2:
    Ende(Link[2],Link[1],Link[7],Link[6])

In Action sieht das ganze dann so aus:
TransputerSkizze1Screenshot

Kaum zu glauben, wie kompakt man früher gearbeitet hat:
Das Transprogramm ist für alle 4 Transputer  zusammen kompiliert und gelinkt ganze 2392 Byte und das Turbopascalprogramm 17280 Byte groß (Achtung Byte, nicht Megabyte).

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert