Hallo
auf der M256 die Stopwatches sind mit ihren uint16_t zu klein für meine Anwendung.
Kann ich aus diesen "einfach" ein uint32_t machen oder vielleicht sogar einen uint64_t (wenn es das gibt)?
Danke
Thorben
Hallo
auf der M256 die Stopwatches sind mit ihren uint16_t zu klein für meine Anwendung.
Kann ich aus diesen "einfach" ein uint32_t machen oder vielleicht sogar einen uint64_t (wenn es das gibt)?
Danke
Thorben
Hallo
Einfacher wäre wohl, wenn man die Stopwatch kaskadiert:
(ungetestet)Code:#define Warteminuten (10*365*24*60) uint32_t stopwatch1_expand=0; if(getStopwatch1() >= 60000) { setStopwatch1(0); stopwatch1_expand++; if(stopwatch1_expand >= Warteminuten) { writeString("Wieder 10 Jahre vorbei\n"); stopwatch1_expand=0; } }
Gruß
mic
Geändert von radbruch (07.02.2013 um 18:28 Uhr) Grund: setStopwatch1(0); sollte erster Befehl im If-Zweig sein
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo,
Warum muss es unbedingt so groß werden?
Klar gibt es den Typedef uint64_t - einfach mal in die stdint.h schauen:
Die beste Lösung wäre das Kaskadieren der Stopwatches, wie radbruch es vorgeschlagen hat.Code:typedef unsigned long long int uint64_t;
Falls Du dann nicht mehr genug Stopwatches hast kannst Du Dir ganz bequem noch ein Paar dazu schreiben.
Falls Du Dich fragst, warum diese Lösung so viel komplizierter ist (Dein Vorschlag wäre ja nur das Ändern eines Variablentyps):
Viele Leute vergessen gerne, auf welcher Hardware sie programmieren. Ein 8-Bit µC kann gut mit 8-Bit Zahlen rechnen, auch mit 16Bit klappt das noch gut.
Klar kann der ATmega32 auch 64-Bit Zahlen addieren, die Frage ist jedoch, wie lange er dafür braucht (noch dazu sind die Stopwatches als volatile deklariert...)
Führe doch mal eine Performancemessung vor der Änderung durch, ändere die Stopwatches dann auf uint64_t und schau nach, ob Dir das immer noch gefällt.
Dabei solltest Du beachten, dass der entsprechende Interrupt alle 100µs ausgelöst wird und in jedem 10. Durchlauf die Stopwatches inkrementiert.
Meine Messungen der kritischen ISR-Laufzeit kommen auf ~101µs, die ISR dauert also länger als erlaubt.
Ob das jetzt schlechte Auswirkungen auf Dein Hauptprogramm hat? Probier's aus
Grüße,
Max
Lesezeichen