Experimente mit dem Prototypen

Alles zum Thema Hardware rund um die Propellerchips und den Hive.
Antworten
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Experimente mit dem Prototypen

Beitrag von drohne235 »

Hier einige Infos zu meinen momentanen Arbeiten und Experimenten mit dem Hive:

Da noch einige Tage Zeit ist bis die Platinen für die Bausätze in Auftrag gehen habe ich noch einige Tests durchgeführt für die bisher keine Zeit war. Eigentlich sind sie vielleicht auch nicht unbedingt nötig, aber einmal mehr getestet kann ja nicht schaden. Also habe ich das testprogramm für den externen Ram etwas erweitert. Bei meiner Platine ist soweit alles ok, aber man kann ja nie ausschließen das bei einer Platine mal eine Durchkontaktierung reißt. Auch die Lötkünste der künftigen Hiveerbauer kann man ja nicht vorhersehen, also ist es vielleicht klug mit Kurzschlüssen oder kalten Lötstellen auf dem Daten- bzw. Adressbus zu rechnen. Wie kann man diese Fehler also sinnvoll automatisch mit einem Test erkennen, das war die Frage. Folgende Tests sind momentan integriert:

[A] 1:1, Random: Hierbei werden gleichzeitig beide RAM-Bänke mit den gleichen Zufallszahlen beschrieben und danach verglichen.

1:1, Negierte Bänke: Dieser Test gleicht Test A bis auf den Unterschied, daß die zweite Bank mit den negierten Werten von Bank 1 beschrieben wird.

[C] Adresskontinuität: Um zu vermeiden der Adressraum durch fehlenden Kontakt oder Kurzschluss auf einer oder mehrerer Adresseitungen nicht linear ist, wird bei diesem Test die Adresse als 32 Bit Wert fortlaufend in den RAM geschrieben und danach verglichen.

[D] Testmuster: Hier wird jede Zelle mit den Mustern $00, $FF, $AA, $55 geprüft.

Der Test läuft endlos, gibt Fehler akustisch (durch den Hertbeatsound) und per Statistik aus. Ich habe bei meinen beiden Prototypen das Programm 24 Stunden ohne Fehler laufen lassen und denke es könnte eine Hilfe beim Aufbau sein.

Nebenher experimentiere ich etwas mit PASM und habe mir gleich überlegt wie man damit diesen Test etwas beschleunigen könnte. Inzwischen habe ich mir eine kleine Shell gebastelt mit welcher ich fast ein wenig interaktiv mit einer Cog experimentieren kann. Zwei kleine Routine um den externen Speicher mit Werten zu füllen und diesen zu überprüfen machen dabei wirklich sehr viel Lust auf mehr:

512 K mit den IOS-Spin-Routinen füllen dauert ca. 60 Sekunden
512 K in PASM mit einem Wert füllen dauert ca. 0,5 Sekunden

Das sind natürlich tolle Werte und man kann durch einige wenige geschickt gewählte PASM-Routinen, die man dann komfortabel in SPIN einbindet, das Testprogramm um den Faktor 100 beschleunigen. Da ich erst anfange die RISC-Kerne per Assembler zu ergründen ist da mit Sicherheit noch einiges Potential da meine Routine wahrscheinlich nicht wirklich optimal ist. Interessant dabei aber folgender Effekt: Eine Routine die einen definierten Wert suchen sollte, lieferte mir immer statt der korrekten Adresse die Folgeadresse. Erst dachte ich an einen Programmierfehler, da ich bei der Füllroutine bewußt immer die Folgeadresse in den Parametervariablen rückgeliefert habe um durch Mehrfachaufruf aufeinander folgende Blöcke zu füllen und ich die Suchroutine aus dieser gebildet habe. Aber alle Sucherei nach dem Fehler brachte keinen Erfolg. Der Code war in seiner logischen Struktur völlig korrekt aber lieferte einen definiert falschen Wert. Erst eine kühles Bier und ein talaxianischer Kaffee brachte mir die Idee, mal zu betrachten ob da in der Hardware etwas nicht so läuft, wie ich es mir ausgedacht hatte. Ein kurzer Überschlag der Zeiten erbrachte folgende Werte: Eine normale RISC-Operation braucht bei 80 MHz zur Ausführung 50 ns. Wenn ich also die Adresse anlege und im folgenden Befehl das Datum der Speicherzelle auf dem Datenbus einlese, hat der RAM 50 ns Zeit diesen Wert bereitzustellen. Der RAM hat aber eine Zugriffszeit von 55 ns :) weshalb ich also mit der Routine immer den Wert des vorigen Schleifendurchlaufs bekomme --> also auch eine Adresse der Fundstelle +1. Gemäß meiner Erwartung brachte das einschieben eines NOP's die korrekten Werte. Den NOP habe ich natürlich wieder entfernt und ersetzt durch eine andere eh erforderliche Operation um keinen unnötigen Overhead zu erzeugen.

Bei den Experimenten mit PASM ist mir noch eine ander Idee gekommen wie man den Hive verbessern könnte: Ich habe für die Selektionssignale und das Schreibsignal je einen Pullup-Widerstand eingebaut, der diese Signale hardwäremäßig auf Inaktivitätspotential hält. Bisher war da nicht nötig, da immer eine COG die volle Kontrolle über diese Signalpegel hatte, aber es könnte das Handling der Bussignale per Software in bestimmten Fällen deutlich erleichtern: Wenn in Regnatix eine COG den Bus für eine bestimmte Zeit an eine andere COG übergibt, kann das ohne großen Softwareaufwand geschehen, ohne das die Signale irgendwie in einen undefinierten Aktivitätszustand gelangen. Zur Übergabe schaltet sich COG A einfach vom Bus indem sie die Portdirection auf Eingabe setzt und gibt COG B ein Startsignal. Die kurze Pause in welcher dabei keine COG die Kontrolle über den Bus hat, kann so nicht mehr zu Problemen führen. Diese Widerstände habe ich in der neuen Platine schon eingearbeitet.
Dateianhänge
Ramtest im Dauerlauf
Ramtest im Dauerlauf
"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
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: Experimente mit dem Prototypen

Beitrag von Rainer »

Hi drohne235,

klingt super. Die Testroutinen werden ganz sicher hilfreich sein.

Mit dem RAM habe ich mich auch schon (theoretisch) beschäftigt.
Für die Sachen die ich so vorhabe brauche ich eine RAM-Disk (FAT16). Da ist mir auch aufgefallen, daß der Speicher für volle Prozessorgeschwindigkeit zu langsam ist.
Meine Idee war nun, die beiden Bänke in einer Art "Burst-Mode" zu betreiben. Da wir ja 2 Bänke haben hätten wir dann (theoretisch) alle 27,5ns Daten am Bus ... schnell genug.
Ohne Hardware ist es aber ein bißchen schlecht zu testen ;)

Außerdem habe ich leider lernen müssen, daß ich meine Assemblerkenntnisse über Bord werfen kann. Programmiere viel mit PASM und Gear und Propeller-Assembler hat Eigenarten mit denen ich nie im Leben gerechnet hätte. Macht aber Spaß :)
Auch so Sachen wie "jmp label" statt "jmp #label" passieren mir andauernd.

Wird sicher noch spannend.

Gruß.
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Benutzeravatar
drohne235
Administrator
Beiträge: 2284
Registriert: So 24. Mai 2009, 10:35
Wohnort: Lutherstadt Wittenberg
Kontaktdaten:

Re: Experimente mit dem Prototypen

Beitrag von drohne235 »

Gute Idee mit dem Burstmodus. Da gibt es sicher noch einiges zu optimieren und zu experimentieren. Irgendwie fand ich die Idee beide Bänke direkt über je ein Portbit zu selektieren passsender als sie fest linear auszudekodieren. So kann man z.B. beide Bänke gleichzeitig löschen oder beschreiben, allerdings muß ich auch selbst per Software dekodieren. Aber wer kann schon sagen ob es nicht ganz praktisch ist zwei physisch ansprechbare Bänke zu haben.

Beim Assembler muß ich auch bei Null anfangen und ich hab auch schon so einiges in Assembler auf anderen CPU's experimentiert. Aber ich finde das die Möglichkeiten der Assemblerroutinen ganz gut in SPIN integriert sind. Ein paar schnelle und kurze Assemblerroutinen komfortabel mit dem relativ langsamen aber kompakten und komfortablen SPIN "zusammenkitten" geht ganz gut. Und meist sind es ja wirklich nur punktuelle Bereiche in denen die Geschwindigkeit von SPIN nicht ausreichend ist.

Wo ich auch einige Zeit gesucht habe ist die (für mich) "falsche" Richtung bei wrlong/wrword/wrbyte - bei allen Assemblerbefehlen geht die Syntax von rechts nach links, nur bei diesen Befehlen ist die Bewegungsrichtung der Daten umgedreht. Irgendwie fand ich das intuitiv nicht richtig, aber das ist ein Fehler den man nur einmal macht. Von deSilva gibt es ein gutes deutsches Assembler-Tutorial - aber das kennst du sicher schon.
"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
Rainer
Beiträge: 510
Registriert: Fr 29. Mai 2009, 16:11

Re: Experimente mit dem Prototypen

Beitrag von Rainer »

drohne235 hat geschrieben:......... Ein paar schnelle und kurze Assemblerroutinen komfortabel mit dem relativ langsamen aber kompakten und komfortablen SPIN "zusammenkitten" geht ganz gut. Und meist sind es ja wirklich nur punktuelle Bereiche in denen die Geschwindigkeit von SPIN nicht ausreichend ist.........
Ja, da muß man pragmatisch vorgehen. Wenn es weder auf Geschwindigkeit noch auf Speicherplatz ankommt kann man durchaus sehr gut mit Spin arbeiten. Die Enwicklungszeiten sind einfach geringer und es ist besser lesbar.

Ein paar Sachen die mir nicht "gefallen" gibts aber schon in Spin (bzw. der IDE an sich):

-- Ich kann z.B. nicht bedingt kompilieren (#ifdef, z.B.) was für's debuggen usw. ganz gut wäre.

Aus "Var := 1+2" optimiert er nicht "Var := 3" ( das kann ich bei Zahlen ja noch selber machen, bei 50 deklarierten Konstanten kann's aber ätzend werden )

Code: Alles auswählen

Aus --->

pub test23
  dummy := 1+2

macht er -->

001C:      36       #1
001D:      37 00    #2
001F:      EC       a+b
0020:      C5 08    Obj[]! 8
0022:      32       Return

statt -->

001C:      37 21    #3
001E:      C5 08    Obj[]! 8
0020:      32       Return
-- Es werden keine unbenutzten Konstanten und PUB's gekillt sondern mitübersetzt.
-- Ich muß meine Libraries für ein Projekt alle in einem Verzeichnis haben, kann also nicht Verzeichnisübergreifend arbeiten.
Um nur einiges zu nennen.
Nichts was man mit einem selbstgebastelten Precompiler nicht lösen könnte, aber den muss man auch erst mal schreiben.

Aber ein echtes Urteil kann ich mir noch nicht bilden. Habe noch zu wenig damit gearbeitet.

Gruß.
Rainer
"Wer andauernd begreift, was er tut, bleibt unter seinem Niveau."
Antworten