Hilfe beim optimieren meiner BMA020 Klasse

Gast #2795074
Lesenswert?

Hi leute,
ich bins schon wieder mit meiner BMA020 Klasse ich hab mich jetzt dazu 
entschieden die Interruptfunktionen weg zu lassen. Denn wenn man sie 
Wirklich braucht ist es besser sie sich selbst zu schreiben hab ich 
bemerckt. Denn da sind einfach zuviele Variabeln abzuwiegen als das 
"ich" das mit in die Klasse packen könnte.

Und da das meine erste "richtige" Klasse ist. Wollte ich mal fragen ob 
ich irgent was einfacher machen könnte oder Rechenzeit einsparen könnte?

Vielen dank schon mal im vorraus ;)

Gruss Robin
Angehängte Dateien:
#2795287
Lesenswert?

Ok hab noch ein paar sachen geändert, wie zum Beispiel unötiges auslesen 
von Registern, und noch ein bisschen kommentiert.

Fällt sonst wehm noch was auf?
Und könnte jemand die Klasse vllt mal auf einem anderen AVR als nem 
m328p ausprobieren? Hab leider keinen anderen da.

Wenn sonst alles in Ordnung ist werde ichs die Tage zur Codesammlung 
packen.

Gruss Robin
Angehängte Dateien:
#2795667
Lesenswert?

Ja der Overhead kann vorkommen hab ich jetzt bei der Klasse aber nicht 
bemerckt.
Und wenn doch was ist fügt man (bei eclipse) "${COMMAND} --cref -s -Os 
${OUTPUT_FLAG}${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} -lm ${FLAGS}" mit ans 
avr-gcc im c++ linker menu das sollte auch die größe reduzieren. Aber 
man sollte erst ohne probieren.

Das Beispiel hat zum Beispiel als hex datei 11,6KB. Ich find das geht 
oder?
Gast #2795747
Lesenswert?

> Und da das meine erste "richtige" Klasse ist. Wollte ich mal fragen ob
> ich irgent was einfacher machen könnte oder Rechenzeit einsparen könnte?

Nun, wenn es Deine erste "Klasse" ist, ist das ganz O.k. In einigen 
Jahren wirst Du das aus einem anderen Blickwinkel betrachten. Aber: 
Weiter so!

Für die Zukunft drei "Nachdenk-Möglichkeiten":

a.) Was ist der Sinn einer Klasse? Was ist der Sinn von Objekten 
(Instanzen einer Klasse)? Was ist, wenn man, warum auch immer, zwei 
BMA020 in einer Schaltung hat?

b.) Für wen programmierst Du? Für den Compiler oder für jemanden der 
Dein Programm in einigen Wochen, Monaten oder Jahren liest? Macht es dem 
Compiler etwas aus, wenn ein Programm so geschrieben ist, dass es für 
einen menschlichen Leser möglichst einfach zu verstehen ist?

c.) Was ist effizienter: 5 Euro mehr ausgeben für einen 
schnelleren/dicken Prozessor oder stundenlang einzelne Bits hin und 
herschieben um es in einen kleinen Mikrocontroller zu quetschen? Baust 
Du ein Massenprodukt wo es auf jeden Cent ankommt?
#2795765
Lesenswert?

Erst mal danke,
und da es zum lernen war/ist dachte ich mir lass ich es schon noch 
übersichtlich das ich es auch in 2,3 Jahren noch versteh.
Ob es hier jetzt sinnvoll war als Klasse zu machen lässt sich auch 
bestimmt drüber streiten denk ich mal, aber zum lernen und im handling 
find ichs ganz gut ;)

Achja so weit ich weis kann man nur einen BMA020 in der schaltung haben 
der hat nämlich ne feste adresse.
#2796195
Lesenswert?

Hab noch nen fehler entdeckt "shadow_disable" muss bit 3 und nicht 2
gesetzt werden. Und hab noch nen bisschen drann rumgebastelt, z.B. die
tmp Variabeln existieren werden nicht mehr benötigt und schon wieder
500byte weniger.

Ferner hab ich noch die i2c_communicate in ne eigene Datei gepackt um
die Funktion im selben Projeckt in verschieden libs haben kann ohne sie
doppelt und dreifach einzubinden.

@Stefan: Hab mal geguckt wie groß der unterschied zwischen Klasse und
nicht Klasse ist er beträgt einen knappen KB.

Wenn euch oder mir bis Morgen nix aufällt pack ichs zur Codesammlung 
wurde jetzt schon so oft gedownloaded und das obwohl noch Fehler drinn 
waren xD
Angehängte Dateien:
Gast #2796222
Lesenswert?

Hier die gleiche unsinn - wie schon oben von jemand geschrieben.
1
 uint8_t buffer[0];
2
 buffer[0] = reg;
3
 i2c_communicate(BMA020_SLAVE, buffer, 1, buffer, 1);

das sollte ohne variable auch gehen
1
 i2c_communicate(BMA020_SLAVE, &reg, 1, &reg, 1);

und was soll das ganze rumgecaste?
1
TWDR=*((uint8_t*)send_data);
2
*((uint8_t*)rcv_data)=TWDR;

Du musst auf jeden Fall noch einmal alles ARRAY prüfen, das sind noch 
andere zu klein!
#2796316
Lesenswert?

Ja.
SChau dein Header File noch mal durch.

Welche der #define muss jemand kennen, der deine Klasse verwendet?
Welche dieser #define sind nur für die Klasse selber interessant und 
müssen daher von niemandem ausserhalb der Klasse gewusst werden?

Alle #define, die in letztere Kategorie gehören, gehören NICHT ins 
Header File sondern ins CPP selber.

Das Headerfile ist in erster Linie eine Beschreibung für denjenigen, der 
die Klasse benutzen will. Dafür, wie das ganze intern funktioniert, soll 
er sich nach Möglichkeit nicht interessieren. Das geht in C++ nicht 
immer besonders gut, weil es keine saubere Trennung zwischen externer 
und interner Beschreibung auf File Ebene gibt (zumindest nicht ohne 
Aufwand, sprich zb PIMPL Idiom), trotzdem solltest du versuchen, es so 
gut es geht umzusetzen. Ein #define welches die Registernummer des 
Low-Bytes der Y-Achse beschreibt, ist für jemanden, der die Klasse 
benutzen möchte, völlig uninteressant. Daher hat das im Header File 
nichts verloren. Er kann daran sowieso nichts ändern und er gewinnt 
daraus keine Information.

Ist ein Makro
#define acc_10Bit(LSB,MSB)  (((int8_t)MSB << 2) | LSB >> 6)
wirklich für jemanden der ein BMA20 Objekt benutzt so interessant, dass 
es im Header File sein muss?


Deine Klasse hat mir ein wenig zu viele statische Funktionalität! Das 
ist nicht wirklich der Sinn der Objektorientierung, dass man Klassen als 
eine Art Namensraum benutzt. In erster Linie möchte man Objekte haben, 
die eine Funktionalität kapseln. Und von diesen Objekten will man viele 
haben können! Soll es nur 1 derartiges Objekt geben können, dann macht 
man ein Singleton, wenn man sich selbst nicht über den Weg traut, das 
einzuhalten. Das hat den Vorteil, dass es dann auch einen Konstruktor 
gibt, der das Objekt zuverlässig als Ganzes in einen Defaultzustand 
bringt.

Wenn du einfach nur alle Variablen, die du bisher hattest und alle 
Funktionen die du bisher hattest, als static in eine neue Klasse 
einfügst, dann kannst du Objektorientierung auch bleiben lassen. Denn 
das ist kein.
Gast #2796477
Lesenswert?

Für mehrere BMA Instanzen wäre es sinnvoll den I2C Bus als Klasse zu 
definieren. Auch wenn nur ein BMA am Bus hängen kann so kann man ja 
mehrere I2C Busse im Gerät haben. Im Kostruktor oder einer ConnectTo() 
Methode würde ich dann die Businstanz übergeben.
Gast #2796502
Lesenswert?

Na einen I2C Bus kann man durch evtl vorhandene Hardware Features im 
controller nutzen oder aber auch per Software an beliebigen Portpins 
implementieren. So wird die BMA Klasse auch universeller mit 
verschiedenen Controllern einsetzbar.

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