www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmgröße beim Umwandeln von string -> float -> string


Autor: Sebastian Gabbert (huehnerhose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Ich hab ein kleines Problem bei der Programmgröße und dem Atmega8. Bis 
jetzt mache ich nichts weiter als von einem GPS-Empfämger die Daten 
seriell zu holen und auf einem LCD anzeigen zu lassen nachdem ich sie 
ein bischen auseinander gepflückt habe - es werden nur Länge/Breite und 
#Sateliten angezeigt. Ich komme dabei auf ca. 965Byte.

Jetzt habe ich das Problem, dass ich den String "5232.7566" habe und mit 
dem ein bisschen Rechnen muss... mir ist da strtod oder atod über den 
Weg gelaufen - dummerweise wächst mein Programmcode beim Einsatz auf 
2456Byte... Die Funktion kommt mir (bei meiner geringen Erfahrung) 
extrem ineffektiv vor... und dann muss ich eigentlich im Anschluss das 
ganze wieder in einen String umwandeln um es wieder auf dem LCD 
auszugeben ein sprintf später bin ich bei 3850Byte... und irgendwie 
finde ich das sehr sehr uncool... das sind schlappe 47% meines 
Programmspeichers die bei der Aktion draufgehen

Eigentlich wollte ich noch zusätzlich eine Koordinatenspeicherung und 
eine "Zeige mir Richtung zu Navigationspunkt"-Funktion (GPS-Kompass) 
einbauen...

Bei dem gLogger-Projekt wird ein Atmega32 (glaub ich) eingesetzt... ist 
das wirklich der einzige Weg oder gibt es irgendwelche Möglichkeiten 
atod/sprintf kompakter in den COde zu bekommen?


Danke schonmal fürs lesen
Sebastian

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Atmega8
Der hat nun mal keine Fließkomma-Einheit. D.h. er muß alle 
Rechenschritte Byte für Byte durchknechten. Versuchs mit 
Festkommaarithmetik, oder behandle Vorkomma- und Nachkommastellen 
getrennt. Fast jeder Ansatz dürfte besser sein (zumal für einen 
Anzeige), als das hin- und her zu wandeln.

> Die Funktion kommt mir extrem ineffektiv vor...
Ja, das wird sie dann wohl auch sein...
Mir kommt dein Ansatz, das mit Fließkommas auf einem 8-Bit uC zu 
berechnen ziemlich ineffektiv vor.

Autor: Uwe ... (uwegw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nimm die "5232.7566", streich den Punkt weg und mach mit strtol einen 
long davon. Damit rechnest du dann weiter (dabei behälst du im 
Hinterkopf, dass du jetzt mit dem Zehntausendfachen des Wertes 
rechnest), wandelst am Ende mit ultoa wieder in nen String und fügst den 
Punkt wieder an der richtigen Stelle ein. Und schon ist das ganze ohne 
einen einzigen float oder sprintf (beide sind ziemliche Speicherfresser, 
wie du siehst) erledigt.

Autor: Sebastian Gabbert (huehnerhose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lothar Miller schrieb:
>> Atmega8
> Der hat nun mal keine Fließkomma-Einheit. D.h. er muß alle
> Rechenschritte Byte für Byte durchknechten.

Darüber habe ich nicht nachgedacht - bin totaler Anfänger :( und habe 
gar nicht daran gedacht, dass eine Fließkommaeinheit ja ein recht 
seltenes Feature sein kann...
Aber der Tipp mit der Festkommaarithmetik ist genau das was ich 
gebraucht habe, danke ^_-

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt im AVRStudio unter Linkeroptionen die libm.a einbinden.

http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_math


Peter

Autor: Sebastian Gabbert (huehnerhose)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:
Das macht keinen Unterschied, aber danke für den Tipp

ich habs auch nochmal mit strtol probiert und komme immer auf recht 
große Codemengen um allein erstmal bei einem Int anzukommen. Ich habe 
dann einfach mal eine etwas größere switch-Anweisung geschrieben. Das 
endet dann bei ~400Byte. Da ich 100% davon ausgehen kann, was da in 
Daten reinkommt, muss ich ja "nur" 10Fälle berücksichtigen... naja... 
ich weiß nicht obs wirklich der Stein der Waisen ist. Aber anders sehe 
ich kein Möglichkeit zu einem Integer zu kommen ohne riesige 
Standardfunktionen einzubinden. Floats brauche ich wirklich nicht, da 
ich ja aus der NMEA-Koordinate eh noch Bogenminuten machen muss.

Wie irreal ist es eigentlich (mal von der Seite von Leuten mit mehr 
Erfahrung) die oben genannten Funktionen in 8K rein zu bekommen? Sind da 
einfach enge Grenzen oder liegt es an zu wenig Wissen meinerseits?

Autor: Andreas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
8K Flash sind mehr als genug für deine Anwendung - du musst sie nur klug 
nutzen.
Welcher Stein auch immer dabei hilfreich sein mag... ;)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Jetzt habe ich das Problem, dass ich den String "5232.7566" habe und mit
dem ein bisschen Rechnen muss...

Du weisst aber, das das 52° 32min 0,7566min bedeutet?

MfG Spess

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian Gabbert schrieb:
> @Peter:
> Das macht keinen Unterschied, aber danke für den Tipp

Schau mal, ob auch 264 Byte SRAM fehlen, die Du Dir nicht erklären 
kannst.
Dann ist die richtige Lib doch nicht gelinkt.


> Wie irreal ist es eigentlich (mal von der Seite von Leuten mit mehr
> Erfahrung) die oben genannten Funktionen in 8K rein zu bekommen? Sind da
> einfach enge Grenzen oder liegt es an zu wenig Wissen meinerseits?

Keine Angst, die Funktionen Float-Lib werden nur beim ersten Gebrauch 
eingebunden. D.h. Du kannst sie so oft verwenden, wie Du willst, der 
Flashverbrauch steigt nur unwesentlich.
Es ist also egal, ob Dein Programm eine oder 100 float-Divisionen 
enthält.




Peter

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.