Forum: Mikrocontroller und Digitale Elektronik Hilfe beim optimieren meiner BMA020 Klasse


von Robin (Gast)


Angehängte Dateien:

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

von Robin G. (gawin)


Angehängte Dateien:

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

von Tobo Bongo (Gast)


Lesenswert?

1
uint8_t buffer[0];
2
buffer[0] = reg;

???

von Robin G. (gawin)


Lesenswert?

Was stört dich daran? Die funktion vordert nen array und das muss bevor 
man was einträgt inizialisiert werden.

von Stefan F. (sfrings)


Lesenswert?

Ich würde es nicht als Klasse implementieren. Klassen bringen einen 
gewissen Overhead mit sich (sagt man, hab' ich nicht überprüft), den man 
bei Mikrocontrollern wegen dem bisschen Speicher vermeiden möchte.

von Robin G. (gawin)


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?

von Alter Hase (Gast)


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?

von Robin G. (gawin)


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.

von Peter II (Gast)


Lesenswert?

hier der nächste speicher überchreiber:
1
 uint8_t buffer[1];
2
3
  buffer[0] = reg;
4
  buffer[1] = value;

Wie viele werte passen wohl in ein array mit der länge 1?

von Robin G. (gawin)


Angehängte Dateien:

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

von Robin G. (gawin)


Lesenswert?

@Peter II: Jo danke is mir nicht aufgefallen Compiler hat nix gesagt und 
ich bins von PHP und JavaScript gewohnt^^ Änder ich nacher noch

von Peter II (Gast)


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!

von Robin G. (gawin)


Angehängte Dateien:

Lesenswert?

@Peter II: Vielen dank für die Tipps vor allem der hinweis mit den 
Arrays auf einmal spar ich 1KB ein (@Stefan: kein unterschied mehr ohne 
Klasse).

Das &reg funktioniert auch was mich freut. Und die typecast hab ich auch 
weg gemacht sonst noch hilfereiche Tipps für Anfänger?

von Karl H. (kbuchegg)


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.

von Robin G. (gawin)


Angehängte Dateien:

Lesenswert?

So habs jetzt in nen namespace gepackt und die defines sortiert.
Siehts jetzt besser aus?

von JojoS (Gast)


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.

von Robin G. (gawin)


Lesenswert?

Nette idee aber da ich mich mit mehreren I2C Bus nicht auskenn wüsst ich 
net wie. xD

von JojoS (Gast)


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.

von Robin G. (gawin)


Lesenswert?

Ich glaub da muss ich erstmal noch ne ganze Menge lernen bis ich das 
hinbekomm^^

Kannst mir ja nen paar tuts posten wenn du lust und zeit hast, dann 
versuch ich mich bestimmt mal drann ;)

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.