Hallo,
ich habe einen AVR32UC3C0512C, der einen IR-Protokollstack über einen
8-Bit Parallelbus anspricht. Im späteren Verlauf des Projektes wird der
µController gewechselt (kleineres Package) bei dem die Pins dann zwar am
selben Port hängen, aber wild verstreut (reicht von Pin 4 bis Pin 27).
Nachdem die Kommunikation und alle Routinen grundsätzlich funktionieren,
würde ich gerne die Geschwindigkeit der Lese- und Schreibroutinen
erhöhen. Derzeit bin ich bei Übertragungsraten von 2,7 MBit/s von
(theoretisch) maximalen 4 MBit/s. Nachfolgend der Code, den es zu
optimieren gilt:
Wie kann ich hier Taktzyklen einsparen? Vor lauter Programmierarbeit,
habe ich gerade keine Ideen mehr :) Vielleicht liegt es auch daran, dass
es schon spät ist.....oder früh.
Gute Nacht und vielen Dank im voraus für eure Mühen
Ist das eine datenbankspeicherplazbelegende Trollfrage, oder dein
ernst??
Dein Bit0 fängt bei PinD11 an und Bit7 hört bei PinD18 auf. Durchweg.
du brauchst doch nur dein temp_bitmask um 11 bit nach unten verschieben
und mit 0xff verunden.... fertig.
Du hast dir echt nichtmal eine Minute lang gedanken gemacht, wie man die
Bitfummelei vereinfachen könnte, oder? :-( Das ist demütigend für jeden
der hier antworten soll -.-
> Im späteren Verlauf des Projektes wird der> µController gewechselt (kleineres Package) bei dem die Pins dann zwar am> selben Port hängen, aber wild verstreut (reicht von Pin 4 bis Pin 27).
Hier steht, dass es sich später nicht mehr so verhält wie im
Codeschnipsel! Dass es zurzeit so geht, wie du es vorschlägst, ist mir
klar.
Tarek T. schrieb:> Hier steht, dass es sich später nicht mehr so verhält wie im> Codeschnipsel! Dass es zurzeit so geht, wie du es vorschlägst, ist mir> klar.
Hier kann aber keiner in die Zukunft sehen und daher eher schlecht einen
Vorschlag machen, wie Code, der später mal entstehen wird, optimiert
werden könnte.
Es geht mir auch eher um einen generellen Hinweis. Aber vielleicht
sollte ich mal ein Beispiel reinstellen. Das momentane Design sieht
folgende Pinbelegung vor:
ein Gast schrieb:> Da es sich um 8bit handelt, würde ich die bytes per Tabelle übersetzen.> Das sollte der uc3 ressourcentechnisch noch frei haben. Vermute ich mal.
Die Tabelle hat bei Bits 4..27 zusammen 24 Adressbits, benötigt also
16MB. Müsste segmentiert werden, d.h. mindestens 2 Tabellen.
Tarek T. schrieb:> Wie kann ich hier Taktzyklen einsparen?
Was kommt denn bisher hinten raus? Müsste sowas wie
BLD ...
ORNE ...
sein, pro Bit.
Wird hier vielleicht keine grosse Rolle spielen, ist aber generell
beachtenswert: Bei einer 32-Bit RISC-CPU sind lokale Variablen kleiner
als 32 Bits summarum ineffizient.
Tarek T. schrieb:> Das momentane Design sieht> folgende Pinbelegung vor:
Dann sind PD27..30 per Shift zu ermitteln und der Rest wie oben.
Das "& 0x1F" ist allerdings witzlos, es ergibt immer 0.
A. K. schrieb:> Bei einer 32-Bit RISC-CPU sind lokale Variablen kleiner> als 32 Bits summarum ineffizient.
Merkbaren Overhead wird das kaum geben.
Wenn der Compiler erkennt, daß Bit 8..31 nicht geändert werden, wird der
Code gleich groß sein.
Nur bei einem möglichen Überlauf wird er zum Schluß ein "& 0xFF"
anfügen.
Tarek T. schrieb:> Wie kann ich hier Taktzyklen einsparen?
Ist das denn ein reales Problem, daß der Code zu langsam ist?
Oder ein ästhetisches Problem mit der 8 Quellzeilen?
Johann L. schrieb:> ein ästhetisches Problem
Vermute ich auch...
Tarek T. schrieb:> /* Pinzustände abfragen */
Der Kommentar ist redundant. Wer sieht nicht, dass in der Folgezeile ein
paar Pins eingelesen werden?
Tarek T. schrieb:> /* Byte wieder zurecht biegen */
Das seh ich auch, dass da was zurechtgebogen-bitgefummelt wird.
Was ist der Zweck der Aktion?
Wenn dir das im Laufcode zu hässlich aussieht, schreib doch eine kleine
Funktion, die dir das Pin-Einlesen/Zurechtbiegen erledigt. Oder eine
Inline-Funktion oder ein Makro...
mfg mf
gegen den Speicherplatz den die Tabelle benötigt
space vs. speed trade off
(die man übrigens von einem Hilfsprogramm erzeugen lässt,
bei viel RAM auch zu Beginn des Programms vom Programm
selbst erzeugen lassen kann
Peter Dannegger schrieb:> Merkbaren Overhead wird das kaum geben.
Je nach Quellcode kann das schon etwas ausmachen. Hier nicht unbedingt,
was ich auch erwähnt hatte.
MaWin schrieb:> Die Tabelle ist 256 Bytes lang,
Bei einem 32-Bit breiten Port eines AVR32 eher nicht. Und die später
verwendeten Bits sind "wild verstreut (reicht von Pin 4 bis Pin 27)",
was auf eine Spanne von 24 Bits rausläuft, also eine 16MB Tabelle.