Alexander (HH): 'Wenn die Minute 64 Sekunden hätte...

Beitrag lesen

Moin Moin!

Hotti will hier was in Perl basteln.

Genau. Hotti hat fixe Ideen und einen Holzkopf.

Eine Maschine, die Perl laufen (im Gegensatz zu kriechen und humpeln) lassen kann, ist in aller Regel gut genug bestückt, um mit ein paar Integer- und Modulo-Divisionen keine Probleme zu haben. Nimm die vorhandenen Routinen in Perl und z.B. in DateTime und verlaß dich darauf, dass sie schnell genug sind.

Das hin- und herschieben von Bits in Perl zur Performance-Optimierung bringt nichts, das geht im Rest von Perl vollkommen unter. Wenn Du unbedingt Bits schubsen willst, laß die Finger von Perl und schreib stattdessen direkt Assembler-Code, optimiert auf eine CPU (und nur eine!) Deiner Wahl.

Ansonsten kannst Du ganz entspannt davon ausgehen, dass aktuelle C-Compiler durchaus effektiven Code generieren, wenn man sie denn läßt. gcc -O2 ist für die meisten Zwecke gut genug. Wenn man für eine ganz spezielle CPU extrem optimierten Code haben will, läßt man den gcc mit einer Tonne Spezial-Optionen laufen oder nimmt hochoptimierte Compiler vom Hersteller (z.B. Intel) mit entsprechendem Tuning. Irgendwo her müssen die phantastischen Benchmark-Ergebnisse ja kommen! ;-)

Das Kernproblem ist, wie Du, Sven schon gestern schriebst, der Übertrag; der binär gesehen also bei 64 stattfindet und nicht bei 60 oder 24, wie das die dämlichen Uhren so machen. Insofern ist nur eine algebraische Lösung sinnvoll für Umrechnungen zwischen h:m:s und Sekunden.

Darf ich mal auf das DCF77-Protokoll verweisen?

Die Leute, die sich das ausgedacht hatten, mußten für extrem einfache Systeme planen. Wir sprechen da über die berühmt-berüchtigte 74XX-TTL-Baureihe. Multiplikation und Division kann man da vollkommen vergessen, selbst Addition und Subtraktion ist viel Aufwand mit 74XX-ICs. Die ersten DCF77-Funkuhren hatten Format und Stromaufnahme eines modernen Mini-PCs, aber weniger Rechenleistung als ein Taschenrechner.

Der Trick:
1. Aufteilen in Einer und Zehner. Statt Stunden, Minuten und Sekunden schlägt sich das DCF-Protokoll mit Zehner-Stunden, Einer-Stunden, Zehner-Minuten, Einer-Minuten, Zehner-Sekunden, Einer-Sekunden.
2. "Rechnen" in BCD. Man benutzt vier Bits, aber nur die ersten zehn Kombinationen von 0000 bis 1001 sind erlaubt.

Einige CPUs haben extra für das Rechnen in BCD zusätzliche OpCodes, z.B. der Z80 (DAA), so dass man tatsächlich die Uhrzeit die ganze Zeit BCD-codiert vorhält. Dann ist die Darstellung tatsächlich recht einfach: BCD-codiertes Byte in den Akku laden, Bits 4 bis 7 auf 0011 setzen, als ASCII interpretieren und als Einer-Stelle darstellen. BCD-Codiertes Byte nochmal in den Akku laden, Akku 4 Bit nach rechts schieben, Bits 4 bis 7 auf 0011 setzen, als ASCII interpretieren und als Zehner-Stelle darstellen.

Alexander

--
Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so".