Forum: PC-Programmierung Embedded Optimierung einer Addressberechnung


von Thomas S. (daimonion)



Lesenswert?

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
von Yalu X. (yalu) (Moderator)


Lesenswert?

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.

von Thomas S. (daimonion)


Lesenswert?

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
Noch kein Account? Hier anmelden.