PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stopwatch zuklein vergrößern?



Thorben W
06.02.2013, 21:06
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

radbruch
06.02.2013, 21:32
Hallo

Einfacher wäre wohl, wenn man die Stopwatch kaskadiert:


#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;
}
}(ungetestet)

Gruß

mic

Max Web
07.02.2013, 12:12
Hallo,

Warum muss es unbedingt so groß werden?
Klar gibt es den Typedef uint64_t - einfach mal in die stdint.h schauen:

typedef unsigned long long int uint64_t;
Die beste Lösung wäre das Kaskadieren der Stopwatches, wie radbruch es vorgeschlagen hat.
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