Hallo Ich möchte eine 32Bit Variable um 0-16 Bits nach links/rechts schieben. der dsPIC33E hat ja einen Barrel-Shifter drauf, der durch verschiedene Assembler und DSP Befehle genutzt wird (ASR, LSR, SL, SAC, SAC.r, SFTAC) https://microchip.wikidot.com/dsp0201:barrel-shifter Nun ja, alles mit 16Bit Variablen. Ich benötige aber den Shift in einer 32Bit Variablen. Da der dsPIC ja nun 40-Bit Accus hat wovon ich die unteren 32Bit auf jeden Fall nutzen kann, dachte ich das ich, wenn ich anstelle eines 16-Bit Wertes einen 32Bit Wert in den Accu lade und dann mittels SFTAC den Shift ausführe, mein Ziel erreiche, aber klappt nicht. Scheinbar nutzt SFTAC nur die oberen (mittleren) 16Bit des Accuregisters Gibt es eine Möglichkeit beim dsPIC33E so einen Shift schnell zu realisieren oder muss ich auf konventionelle Algorithmen (C-Standard a<<b compiliert was konventionelles) zurückgreifen. Danke im Voraus für eure Antworten! Grüße Daimonion
Thomas S. schrieb: > aber klappt nicht Prima Beschreibung des Problems. Code mit Werten wär besser, verziert mit den Werten vorher und nachher.
Die meisten Prozessoren haben 2 verschiedene Schiebebefehle. 1. Immer 0 reinschieben; Überlauf ins Carry-Bit 2. Carry-Bit reinschieben; Überlauf ins Carry-Bit Hast Du den ersten Befehl nicht zur Verfügung, so musst Du explizit deinen Lieblingswert in Carry-Bit schreiben. Meist ein Clear oder Set XX-Befehl. Hast Du 16 Bit Befehle, so kannst Du auch durch das Kopieren glücklich werden. Low-Word ins High-Word kopieren oder umgekehrt und das Ausgangsregister löschen. Kenne aber Deinen Prozessor nicht.
Es geht hier explizit um einen speziellen Shift Befehl des 33E Prozessors. Wie das normalerweise geht weiß ich. Daher sind eure Antworten leider nicht zielführend. @prx Ich bekomme keine 32Bit Variable in den Accu rein und später auch wieder nicht raus. Der Shiftbefehl selbst sollte theoretisch mittels sftac ohne Probleme gehen. Theoretisch, da ich nicht weiß wie sich accul bei einem linksshift verhält...
Thomas S. schrieb: > Ich bekomme keine 32Bit Variable in den Accu rein und später auch wieder > nicht raus. Vielleicht solltest du mal zeigen, wie du das machst. > Daher sind eure Antworten leider nicht zielführend. Es gibt keine solide Grundlage für Antworten, die du als zielführend ansiehst. Wäre dir "Fehler in Zeile 42" lieber?
:
Bearbeitet durch User
Wie kann ich es zeigen, wenn ich nicht weiß wie es geht? Der Link in meinem ersten Post ist bisher das einzige Beispiel was ich gefunden habe. Alle anderen Beispiel und auch Application Notes von Microchip zeigen es so nicht auf oder ich hab es noch nicht gefunden. Daher die Frage hier im Forum!
Thomas S. schrieb: > Wie kann ich es zeigen, wenn ich nicht weiß wie es geht? Also hast du also noch keine Zeile Code geschrieben? Du suchst einen Weg, 32 Bits geschlossen in den Akku zu laden? Gibt es nicht. Ist umständlicher. Woraus sich die Frage ergibt, ob das Verfahren über den DSP die Mühe Wert ist. Nur für die Shift-Operation allein dürfte es summarum mindestens so aufwändig sein, wie die Alternative aus normalen 16-Bit Operationen.
A. K. schrieb: > Also hast du also noch keine Zeile Code geschrieben? Du suchst einen > Weg, 32 Bits geschlossen in den Akku zu laden? Gibt es nicht. Ist > umständlicher. Ja, so was hab ich mir fast gedacht. ;) Denke dass das dann irgendwie über den X- und Y-Memory funktioniert? Mit dem hatte ich bisher noch nichts zu tun. > Woraus sich die Frage ergibt, ob das Verfahren über den DSP die Mühe > Wert ist. Nur für die Shift-Operation allein dürfte es summarum > mindestens so aufwändig sein, wie die Alternative aus normalen 16-Bit > Operationen. Die Laufzeitfrage muss man dann definitiv betrachten. Der Overhead ist ja schon ziemlich groß. Dennoch würde ich gerne mal einen Vergleich aufstellen. Mal schauen ob ich irgendwo noch was finde, oder kennst du prinzipiell den Weg?
Die DSP-Akkumulatoren haben auch eine Adresse im Speicher.
Okay, danke erst mal. Soweit verstanden. Sind ja dann schon mal ~4 Befehle (LAC high, LAC Low, Shift Low, Add) nur die Daten zusammen in einem Accu zu haben. Dann der Shift und dann nochmal ~3 Befehle um die Daten wieder raus zu bekommen. Ich mach mich mal ran und schau inwieweit ich was effizientes oder eben ineffizentes hinbekomme. Danke erst mal! Grüße Daimonion
Dieser DSP ist eben kein Universalinstrument, sondern für ganz bestimmte Anwendungsfälle optimiert. Nämlich bestimmte Formen von Arithmetik wie Matrizenmultiplikation, bei denen Zwischenergebnisse eine Weile im Akku verbleiben und eine grössere Genauigkeit nur in dieser Phase nötig ist.
:
Bearbeitet durch User
Thomas S. schrieb: > Da der dsPIC ja nun 40-Bit Accus hat wovon ich die unteren 32Bit auf > jeden Fall nutzen kann, dachte ich das ich, wenn ich anstelle eines > 16-Bit Wertes einen 32Bit Wert in den Accu lade und dann mittels SFTAC > den Shift ausführe, mein Ziel erreiche, aber klappt nicht. Scheinbar > nutzt SFTAC nur die oberen (mittleren) 16Bit des Accuregisters Hast Du nun schon Code geschrieben oder nicht? Da es ja nicht klappt, mußt Du ja schon was probiert haben... Wie kommen denn deine 32bit in den Accu? So wie ich das verstehe, kann LAC ein W-Register grundsätzlich nur in ACCAH verschieben. Genauso bei SAC, es wird immer nur ACCAH gelesen. Ich weiß jetzt nich ob es geht, aber hast Du mal versucht die ACCAH-, ACCAL-Register direkt anzusprechen?
Direkt ansprechen kannst du die Register nicht. Du musst mittels LAC erst das Low Word laden, dann mittels sftac nach rechts in AccuL shiften und dann mittels eines weiteren LAC das HighWord wieder in AccuH laden. Dann kann man mittels SFTAC nach links shiften. In AccuU stehen dann noch einsen drin, und das kann u.U Probleme bei einem rechtsshift geben. Aktuell warte ich noch auf eine Rückmeldung unseres FAE, der mir auch noch Infos zukommen lassen wollte, bevor ich was probiere.
Thomas S. schrieb: > Direkt ansprechen kannst du die Register nicht. Doch, wie ich oben nachträglich erwähnte. > Du musst mittels LAC erst das Low Word laden, dann mittels sftac nach > rechts in AccuL shiften und dann mittels eines weiteren LAC das HighWord > wieder in AccuH laden. Einfacher: Löschen, dann wortweise reinschreiben. Über die Adresse der Akkus im Daten-Adressraum (ab 0x0022, => Core Register Map). Genauso auch wieder raus.
:
Bearbeitet durch User
Ah, das ging bei mir in der Frequenz der Beiträge unter. Ist natürlich auch noch eine Möglichkeit. ;)
Thomas S. schrieb: > Du musst mittels LAC erst das Low Word laden, dann mittels sftac nach > rechts in AccuL shiften und dann mittels eines weiteren LAC das HighWord > wieder in AccuH laden. LAC schreibt in alle 40 Bits (zero/sign-extended) des Akkus.
Aber nur 16 Bit Register oder? Das ist dann blöd....
Thomas S. schrieb: > Das ist dann blöd.... Für dich ja. Für das, wofür dieser DSP gedacht ist, reicht es. 16 Bits rein, einige Male mit 40 Bits in Festkommaformat rechnen inklusive Überlauf (links) und hoher Genauigkeit für kleine Differenz grosser Zahlen (rechts), abschliessend gerundete und evtl. saturierte 16 Bits wieder raus.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.