Hallo AVR-Freunde, bekanntermaßen fehlt so etwas wie "time.h" in GCC-AVR. Ich habe mir jetzt ein paar Funktionen geschrieben, die das für mich etwas beheben sollen. Die altbekannte Tastenentprell-Funktion von Peter Danneger(?) habe ich aufgebohrt, so dass ich einen 32-Bit-Sekundenzähler bekomme ohne weitere Resourcen (Timer) zu verschwenden. Es ist Teil einer größeren Library für das Minimod18 von Elektor, ist daher auf den ATMEGA328p@16MHz ausgelegt. So etwas könnte aber auch für andere nützlich sein, deshalb poste ich das hier. Der Code steht unter der GPL, ihr könnt also nach Belieben anpassen und ändern. Ich konnte keine Routinen für die Umrechnung Datum<->Sekunden finden, die mich überzeugt hätten. Dehalb habe ich sie mir selbst geschrieben (Sch***-Schaltjahre ;) ). Ein paar Beta-Tester wären da praktisch, die vielleicht kontruktive Verbesserungsvorschläge machen. Ich habe die Routinen so weit getestet, dass Hin- und Rückwandlung wieder dasselbe Ergebnis bringen (das ist ja schon einmal nicht schlecht) und dass es den 29.2 tatsächlich nur in Schaltjahren gibt. Ich habe da aber auch noch eine technische Frage. Das Ganze soll als einbindbare Library (.a) genutzt werden können, wo sich der Linker nur das rauspickt, was wirklich gebraucht wird. Die Funktionen localtime() und mktime(), die nicht immer beide gebraucht werden, könnten auf dasselbe Array days_of_month[] im Flash zugreifen, wenn ich wüsste, wie man das korrekt im Header-File deklariert und dafür sorgt, dass dies auch automatisch eingebunden wird, wenn mindestens eine der beiden Funktionen genutzt wird. Mit der jetzigen Lösung wird das Array für jedes Modul getrennt angelegt. Das "verschwendet" 12 Flash-Bytes, womit ich noch leben könnte. Aber ich würde natürlich für die Zukunft gern wissen, ob es besser geht. Vorschläge? Gruß, DetlevT
Detlev T. schrieb: > Mit der jetzigen Lösung wird das Array für jedes Modul getrennt > angelegt. Das "verschwendet" 12 Flash-Bytes, womit ich noch leben > könnte. Aber ich würde natürlich für die Zukunft gern wissen, ob es > besser geht. Vorschläge? Packe in time.h nur eine Deklaration des Arrays und lagere die Definition in eine separate C-Datei aus (und dann natürlich ohne das static). Außerdem geht eigentlich niemandem außerhalb der Lib dieses Array etwas an, es wäre also besser für diese internen Sachen eine zusätzliche Header-Datei anzulegen. Also time.h nur für das externe Interface und time_intern.h (oder wie auch immer du das nennen willst) für die Library internen Sachen.
Hallo Stefan, kannst du einmal genau aufschreiben, wie diese Deklaration aussehen muss?. Meine Versuche mit verschiedenen Kombinationen von attributen wollte dem Compiler alle nicht schmecken. "Geht keinen was an" lasse ich in diesem speziellen Fall nicht gelten. Vielleicht will jemand irgendwann eine Eingaberoutine für das Datum schreiben und kann dann mit diesen ohnehin im Speicher schlummernden Informationen Fehleingaben wie den 31. April abfangen. In meinen Routinen habe ich bewusst auf Plausibilitätsprüfungen verzichtet. Gruß, DetlevT
Deklaration in Header:
1 | extern uint8_t days_of_month[12]; |
Definition in separater C-Datei:
1 | uint8_t days_of_month[12] PROGMEM = {31,29,31,30,31,30,31,31,30,31,30,31}; |
PS: Wichtig ist hier auch das "separater". Wenn du es einfach in eine der bereits existierenden C-Dateien packst, funktioniert es zwar auch, verschwendet aber ggf. wieder Platz. Detlev T. schrieb: > "Geht keinen was an" lasse ich in diesem speziellen Fall nicht gelten. > Vielleicht will jemand irgendwann eine Eingaberoutine ... Dann solltest du im Header dokumentieren, dass das Array im Flash liegt. Das kannst du durch das PROGMEM-Attribut machen (was bei der Deklaration keinen funktionellen Unterschied macht), oder einfach durch einen Kommentar.
Hallo Stefan, ja Danke, so gehts. (Wo zum Geier hatte ich jetzt noch gelesen, dass PROGMEM immer static sein muss?) Im Anhang die korrigierte Version. Falls es jemand interessiert: localtime() braucht etwa 600 Bytes, mktime() etwa 400. Gruß, DetlevT
Erratum: Ich hatte das Makefile noch nicht angepasst. Hier jetzt die korrigierte korrigierte Version. ;)
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.