Hallo liebe Freunde habe kein kleines Problem möchte gerne einen String den ich ausgelesen habe folgendermaßen verändern
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
Der String wurder Seriell ausgelesen nun stehe ich da und weiss nicht weiter !
|
Anzeige
|
Arduino Bit Shifting ProblemHallo liebe Freunde habe kein kleines Problem möchte gerne einen String den ich ausgelesen habe folgendermaßen verändern
Der String wurder Seriell ausgelesen nun stehe ich da und weiss nicht weiter !
Gast
#6011132
Bis auf das zweite Byte sind das alles Bit-Reverse Operationen. Bist Du sicher, das die Darstellung vom zweiten Byte richtig ist? Nils schrieb: > Bis auf das zweite Byte sind das alles Bit-Reverse Operationen. Genau. Die Funktion y = bitrev(x); dreht dir ein einzelnes Byte entsprechend um. und wo kommt die bitrev-funktion her? das frage ich mich auch gerade da sie nicht in der Referenz erwähnt wird. hier mal mein ganzer code
hier wäre eine solche btirev-funktion, aber ich möchte mal tippen: nicht in den standard arduino funktionen... https://github.com/volthouse/hardware-firmware-arduino/blob/master/DL0815/libraries/Sensirion/Sensirion.cpp (ganz unten) edit: code als anhang und nicht im post selber Nils schrieb: > Bis auf das zweite Byte sind das alles Bit-Reverse Operationen. Das zweite Byte ist bereits im Quellstring falsch in der Bit-Darstellung. Wenn man 48h richtig als 01001000b darstellt, stimmt auch das Ziel-Byte 12h (00010010b). ja hast recht verhauen aber scheint ja klar zu sein was ich vor habe bitrev ist in keinster weise verfügbar leider. grrrr Selbst für einen Arduino-Programmierer sollte es möglich sein, eine so banale Funktion schnell selber zu schreiben:
Quick&Dirty
Gast
#6011303
Hi >Quick&Dirty Geht einfacher: Beitrag "Re: LCD Datenleitungen invertieren" MfG Spess spess53 schrieb: > Geht einfacher: Einfacher liegt hier im Auge des Betrachters. Einfacher finde ich meine Version, deine könnte dafür aber schneller sein.
Gast
#6011313
Hi ...deine könnte dafür aber schneller sein. Ist nicht meine. Ich wusste nur das es das Problem hier schon mal gab. MfG Spess spess53 schrieb: > Ist nicht meine. Ich wusste nur das es das Problem hier schon mal gab. Stimmt, is von PeDa. Aber er scheint bekannt dafür, dass sein Code nicht auf Anhieb ersichtlich is ;) Hatte mich schon gewundert das du C programmierst, du bist doch ASM Spezi nicht wahr?
Gast
#6011326
Hi >Hatte mich schon gewundert das du C programmierst, du bist doch ASM >Spezi nicht wahr? Na ja. Manchmal kommt auch C-Spezies etwas brauchbares. Eine ASM-Umsetzung dieses Codes habe ich in meiner Mathe Lib. MfG Spess
Gast
#6011358
Michael R. schrieb: > ja hast recht verhauen aber scheint ja klar zu sein was ich vor habe > bitrev ist in keinster weise verfügbar leider. grrrr Dann solltest du darüber nachdenken, selber eine solche Funktion verfügbar zu machen. Hast du schon mal an selber programmieren gedacht? ;-) Ingo L. schrieb: > Hatte mich schon gewundert das du C programmierst, du bist doch ASM > Spezi nicht wahr? In ASM ist das Problem ja so trivial lösbar... 8mal ROL und ROR in einer Schleife geht rasend schnell.
Gast
#6011385
Hi >In ASM ist das Problem ja so trivial lösbar... >8mal ROL und ROR in einer Schleife geht rasend schnell. Also mindestens 24 Befehle + Kleinkram. Da ist PeDas Routine kürzer und schneller [avrasm] mirror_fast: push r17 swap r16 mov r17,r16 lsr r16 lsr r16 lsl r17 lsl r17 andi r16,$33 andi r17,$CC or r16,r17 mov r17,r16 lsr r16 lsl r17 andi r16,$55 andi r17,$AA or r16,r17 pop r17 ret [{avrasm] MfG Spess
Gast
#6011405
Man betrachte den Titel: Arduino Bit Shifting Problem - Es stellt sich heraus dass das Anliegen nichts mit Bit shiften zu tun hat. - es darf gefragt werden was denn Arduino mit Bit Shifting zu tun hat (klingt nach: "der Arduino kann nicht Bit shiften"). - der TO ist nicht fähig die Hinweise zum Posten von Quelltext zu lesen und umzusetzen. Da geht es in einem Thread drunter und drüber, was für eine verquere Welt .....
Gast
#6011419
Hi Über den Dingen (Gast) schrieb >- Es stellt sich heraus dass das Anliegen nichts mit > Bit shiften zu tun hat. Wieso nicht? In allen vorgestellten Lösungen wird 'geshiftet'. Der Rest von dir ist genauso daneben. MfG Spess spess53 schrieb: > Also mindestens 24 Befehle + Kleinkram. > > Da ist PeDas Routine kürzer und schneller Beides Erstere bezweifele ich. Zu "schneller" muss ich mal die Takte zählen! Route_66 H. schrieb: > Zu "schneller" muss ich mal die Takte zählen! Und dafür müsstest du die tatsächliche Zielhardware kennen... Dein AVR-ASM funktioniert auf nem AVR, es mag aber auch sein das er einen Arduino mit nem 32-Bitter verwendet. Daher wäre hier eine Lösung in C angesagt, wie von mir oder Spess, dein ASM hilft hier unter Umständen dem TE nicht weiter... O.K. Pedas Variante ist schneller, egal auf welcher Hardware! Drei Vertauschungen sind effektiver als 8 mal Hin- und Herschieben. Der TE sollte das Prinzip verstehen, und selbst für seine Hardware und Softwareumgebung umsetzen. Route_66 H. schrieb: > Der TE sollte das Prinzip verstehen Oder er erschlägt das Problem "Brute-Force":
Ingo L. schrieb: > Oder er erschlägt das Problem "Brute-Force": Da möchte ich gern mal den ASM-Output des so genialen Compilers sehen! (c-hater sicher auch?) OK: AVR-GCC9.2.0, Optimierung = Os
AVR-GCC9.2.0, Optimierung = O3
Ich muss gestehen das in O3 das Ganze ziemlich exakt das ist, was der C auch macht. Ingo L. schrieb: > OK: AVR-GCC9.2.0, Optimierung = Os Auch zu groß. Lesbare und verständliche Alternative zu PeDas Code:
Eigentlich ist das nix anderes als eine ausgerollte Schleife. Größe der Funktion mit avr-gcc 4.7.2 -Os: 42 Bytes. Frank M. schrieb: > Eigentlich ist das nix anderes als eine ausgerollte Schleife. Eben, die eingerollte Schleife dazu schrieb ich bereits weiter oben Ingo L. schrieb: > Frank M. schrieb: > Eigentlich ist das nix anderes als eine ausgerollte Schleife. > > Eben, die eingerollte Schleife dazu schrieb ich bereits weiter oben Der Witz ist: Die eingerollte braucht mehr Bytes an Code als die ausgerollte. Aus Deiner LSS lese ich: 50 Bytes, aus meiner LSS lese ich: 42 Bytes. Die Schleife lohnt sich also erst bei größeren Bitbreiten als 8. Aber auch da gibt es für 16Bit und 32 Bits Alternativen, zum Beispiel diese hier:
Zu diesem Thema gabs hier auch schon einen ausführlichen Thread - inkl. Lösungsvorschläge über Lookup-Tables (für Nibbles), um so schnell wie möglich zu sein.
Gast
#6011554
ARM Cortex M3 aufwärts hätte "rbit" http://infocenter.arm.com/help/topic/com.arm.doc.dui0552a/BABJJDDB.html das kehrt die Bit-Reihenfolge in einem 32Bit-Wort um. Der M3 hat auch einen Barrel-Shifter. Der AVR nicht Geh ich recht in der Annahme, dass du Route_66 H, überrascht bist, dass das, was der Compiler generiert, doch ganz ok ist, sodass du nun auf C umgestiegen bist? SCNR Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|