dsPIC33E 32Bit Wert mit Barrel-Shifter schieben

OP #4232432
Lesenswert?

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
Gast #4232455
Lesenswert?

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.
OP #4233369
Lesenswert?

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...
OP #4233394
Lesenswert?

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!
#4233410
Lesenswert?

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.
OP #4233414
Lesenswert?

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?
OP #4233430
Lesenswert?

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
#4233434
Lesenswert?

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.
#4233488
Lesenswert?

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?
OP #4233495
Lesenswert?

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.
#4233500
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren