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


von Sebastian G. (huehnerhose)


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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Uwe .. (uwegw)


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.

von Sebastian G. (huehnerhose)


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 ^_-

von Peter D. (peda)


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

von Sebastian G. (huehnerhose)


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?

von Andreas (Gast)


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... ;)

von spess53 (Gast)


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

von Peter D. (peda)


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

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.