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
> 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.
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.
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 ^_-
Du mußt im AVRStudio unter Linkeroptionen die libm.a einbinden. http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_math Peter
@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?
8K Flash sind mehr als genug für deine Anwendung - du musst sie nur klug nutzen. Welcher Stein auch immer dabei hilfreich sein mag... ;)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.