Frage zum Handshake im Bellatrix-Code

Du hast ein Betriebssystem für den Hive geschrieben oder beschäftigst dich mit den grundlegenden Systemfunktionen, dann bist du hier richtig!
Antworten
Benutzeravatar
Micha
Beiträge: 813
Registriert: Sa 24. Mär 2012, 21:45
Wohnort: Merseburg
Kontaktdaten:

Frage zum Handshake im Bellatrix-Code

Beitrag 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?
Also vonder Sache här tätch jetz ma behaupten "Mischn ägomplischd" un so...
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Frage zum Handshake im Bellatrix-Code

Beitrag von drohne235 »

Regnatix wartet ja per waitpeq auf das Quittungssignal von Bella, warum sollte er das verpassen?
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
Benutzeravatar
Micha
Beiträge: 813
Registriert: Sa 24. Mär 2012, 21:45
Wohnort: Merseburg
Kontaktdaten:

Re: Frage zum Handshake im Bellatrix-Code

Beitrag 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.
Also vonder Sache här tätch jetz ma behaupten "Mischn ägomplischd" un so...
Benutzeravatar
PIC18F2550
Beiträge: 2832
Registriert: Fr 30. Sep 2011, 13:08

Re: Frage zum Handshake im Bellatrix-Code

Beitrag 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.
Gruß
PIC18F2550

drone265/278
Barbarus hic ergo sum, quia non intellegor ulli.
Ein Barbar bin ich hier, da ich von keinem verstanden werde.
ʎɐqǝ ıǝq ɹnʇɐʇsɐʇ ǝuıǝ ɹǝpǝıʍ ǝıu ǝɟnɐʞ ɥɔı ´uuɐɯ ɥo
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Frage zum Handshake im Bellatrix-Code

Beitrag 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.
"Ob Sie denken, dass Sie es können, oder ob Sie denken, dass Sie es nicht können - in beiden Fällen haben Sie recht." Henry Ford
Antworten