Seite 1 von 1

Frage zum Handshake im Bellatrix-Code

Verfasst: So 6. Jul 2014, 16:30
von Micha
Ich hab mir noch mal das "Build your OS part 2" Tutorial durchgelesen, in dem Regnatix Zeichen über den Bus an Bellatrix sendet. Mit dem Ablauf des Handshake im Bellatrix-Code hab ich ein Problem:

Code: Alles auswählen

PUB bus_getchar : zeichen                               'BUS: Ein Byte über BUS empfangen
{{ein byte über bus empfangen Regnatix --> Bellatrix}}
   waitpeq(M1,M2,0)                                     'busclk=1? & prop2=0?
   zeichen := ina[7..0]                                 'daten einlesen
   outa[bus_hs] := 0                                    'daten quittieren
   outa[bus_hs] := 1
   waitpeq(M3,M4,0)                                     'busclk=0?
Funktioniert offenbar, ich hätte das allerdings niemals nicht so gemacht. Konkret versteh ich nicht, wieso das bus_hs Signal gesetzt und gleich wieder zurückgenommen wird, ich hätte die letzten drei Zeilen garantiert so geschrieben:

Code: Alles auswählen

   outa[bus_hs] := 0                                    'daten quittieren
   waitpeq(M3,M4,0)                                     'busclk=0?
   outa[bus_hs] := 1
Offenbar funktioniert es auf beide Arten (hab das gerade mal getestet), aber wieso die obere Variante stabil funktioniert ist mir vom Prinzip nicht ganz klar - eventuell gehts nur deshalb gut weil die Zeichenübertragung die Props ohnehin nicht bis an die Grenze ihrer Leistungsfähigkeit fordert? Im oberen Fall könnte ich mir prinzipiell vorstellen dass Regnatix die Quittierung verpasst, weil diese viel zu schnell vorbeihuscht. Oder irre ich mich?

Re: Frage zum Handshake im Bellatrix-Code

Verfasst: So 6. Jul 2014, 18:44
von drohne235
Regnatix wartet ja per waitpeq auf das Quittungssignal von Bella, warum sollte er das verpassen?

Re: Frage zum Handshake im Bellatrix-Code

Verfasst: So 6. Jul 2014, 18:57
von Micha
drohne235 hat geschrieben:Regnatix wartet ja per waitpeq auf das Quittungssignal von Bella, warum sollte er das verpassen?
Die Praxis hat diese Frage zugegebenermassen schon beantwortet - es funktioniert so wie es in dem Tutorial (und auch bis zur aktuellen Version von Trios) so gecoded ist. Trotzdem - ich hätte das nicht so programmiert.
Warum Regnatix den kurzen Wink theoretisch hätte verpassen können - weil SPIN eben eine Hochsprache ist, da ist nicht von vorneherein klar wieviele Systemtakte ein Befehl braucht bis die entsprechende Aktion läuft. Der OUTx Befehl ist vermutlich 1:1 ein Maschinensprachbefehl, bei WAITPEQ ist nicht sicher ob das so ist.
Der Code so wie er geschrieben ist impliziert meiner Meinung nach, dass jeder Befehl in einem Takt abgearbeitet wird, was für SPIN manchmal aber nicht unbedingt immer gilt.

Re: Frage zum Handshake im Bellatrix-Code

Verfasst: So 6. Jul 2014, 19:35
von PIC18F2550
Wenn Regnatix schneller ist als Bellatrix z.B. PASM so läuft er in die noch bestehende Qittungszeit und es geht ein Zeichen verloren.

Regnatix sollte desshalb nicht nur auf das setzen des Signales warten sondern auch auf dessen Rücknahme.

Auf das Problem binn ich schon bei HBasic gestoßen, wenn ich Blöcke aus dem COG-Ram gesendet hatte.

Re: Frage zum Handshake im Bellatrix-Code

Verfasst: So 6. Jul 2014, 22:57
von drohne235
Wenn Regnatix schneller ist als Bellatrix z.B. PASM so läuft er in die noch bestehende Qittungszeit und es geht ein Zeichen verloren.
Wenn Regnatix schneller läuft passiert überhaupt nix, dann wartet Regnatix nur früher. Zu sehen bei mental, dort laufen die Busroutinen in Regnatix komplett in Maschinencode in der Cog. Und es funktioniert in mental übrigens auch stabil wenn ein Slave ein Zeichen sendet - obgleich die Routinen in Regnatix dabei um den Faktor 60..100 schneller sind als in Spin.

Für den Fall, das die Busroutinen in Master und auch in den Slaves in Maschinencode laufen, würde ich es eh anders programmieren, denn dann kann man durch das determinierte Zeitverhalten ausgehend von einem Startsignal weitestgehend komplett synchron und ohne die Quittungssignale arbeiten.