Forum: Compiler & IDEs Timelib und PROGMEM-Frage


von Detlev T. (detlevt)


Angehängte Dateien:

Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Detlev T. (detlevt)


Lesenswert?

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

von Stefan E. (sternst)


Lesenswert?

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.

von Detlev T. (detlevt)


Angehängte Dateien:

Lesenswert?

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

von Detlev T. (detlevt)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.