Hallo Ich schreibe mal hier ins Programmierforum weil es kein Embedded Forum zum Thema programmieren gibt. Ich habe eine Flashaddressberechnung für einen dsPIC33E die vereinfacht werden soll. Es geht dabei um zu speichernde Daten im Flash. Der dsPIC hat ja 24Bit (3Byte) breite Flashzellen die mit geraden Adressen je 16Bit Daten angesprochen werden. Die obersten 8 Bit werden als Phantombyte bezeichnet. Beispiel: Addr 0h0 Daten 0hxxAABBCC Addr 0h2 Daten 0hxxDDEEFF 6 Byte Daten werden hier also an 4 Addressen gespeichert (wobei die ungeraden Addressen nie angesprochen werden dürfen. Das Excelsheet zeigt nun einen Algorithmus (Matherechnung ^^) wo durch reine Angabe der Datenlänge in Byte errechnet wird, wie viele Adressen benötigt werden. Dies soll für die Offsetberechnung genutzt werden. Da der dsPIC nicht der schlechteste µC ist, aber eben auch nicht der Beste frage ich mich, ob man die Rechnung noch vereinfachen kann. D.h. Modulos nach Möglichkeit nicht nutzen und die Division nach Möglichkeit vermeiden. Sehr ihr da noch Optimierungspotential? Danke schon mal im Voraus für eine konstruktive Diskussion!
:
Bearbeitet durch User
Wenn x der Wert in der 1. Excel-Spalte ist, dann ist die zweite Spalte (x + 3) / 3 * 2 und die 3. Spalte (x + 2) / 3 * 2 wobei der /-Operator für die ganzzahlige Division mit Abrunden steht. Modulo-Operationen und explizite Fallunterscheidungen brauchst du keine. Ich weiß nicht, wie schnell der dsPIC durch 3 dividieren kann. Falls eine Multiplikation deutlich schneller ist, könnte man evtl. die Skalierung nach folgendem Ansatz ausführen: x * (2^n · 2/3) / 2^n wobei ^ der Potenzoperator und n – und damit auch 2^n·2/3 eine vom gewünschten Wertebereich der Umrechung abhängige Konstante ist. Die Division durch 2^n ist durch Bitshiften realisierbar, also ebenfalls schnell. Ggf. müssen noch Additionen oder Subtraktionen mit kleinen Korrekturkonstanten hinzugefügt werden.
Oh Gott, jetzt seh ich erst welche doppelten Schleifen ich gedreht habe.... Danke Yalu fürs Augen öffnen. Manchmal sieht man den Wald vor lauter Bäumen nicht. Dankeschön dafür. Die Division durch 3 benötigt 18 Zyklen. Vs eine Multiplikation, die 1 Zyklus braucht. Shifts werden auch in 1 Zyklus abgehandelt. Von daher sehe ich mir auch mal deine Potenzierungsrechnung an. Aber ich denke dass ich diese eine Division akzeptieren kann. Wichtig war mir dass die Modulos weg kommen. Danke dir! BTW. In der geschriebenen Excelformel zum Endergebnis AddrCount war noch ein Fehler. Es wird hier nicht die Zwischensumme für die Modulorechnung herangezogen sondern die Datenlänge. In der Tabelle war dann aber alles richtig gerechnet.
:
Bearbeitet durch User
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.