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
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
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.
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?
> 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?
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.
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
@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 ® funktioniert auch was mich freut. Und die typecast hab ich auch
weg gemacht sonst noch hilfereiche Tipps für Anfänger?
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.
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.
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.
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 ;)