C-Optimierung

#3973500
Lesenswert?

Hallo zusammen

Ich hoffen jemand von euch kann mir bei der Optimierung der folgenden 
Operation behilflich sein:
1
// 72x10^9
2
Freq = 72000000000/Capture //Frequenz in mHz

Hintergrund:

Ich Messe die Anzahl Takte zwischen zwei Interrupevents (Freq. Messung)
Die Frequenz beträgt ca. 40-60Hz

Der Countertakt ist 72MHz
Die Anzahl Takte welche zwischen zwei Interrupts vergangen sind
stehen in der Capture Variable.

Capture ist uint32_t


Wenn ich nun 72x10^6 / Capture rechne, erhalte ich für einen Capture 
Wert
von 72x10^6 1. Somit 1Hz.

Da ich jedoch eine Auflösung von 1mHz möchte, muss ich im Zähler um 
Faktor 1000 grösser werden. Somit ist die Rechnung jene von oben.

Da die Divisionen ja bekanntlich Rechenintensiv sind, möchte ich dies 
gerne Optimieren.

MCU ist ein STM32F1x Cortex M3


Danke!
Gast #3973508
Lesenswert?

Wenn du deine Anzeige nur 1/s auffrischst ist es doch egal wie schnell 
oder langsam die Division ist. Was willst du da optimieren?

Wenn du mHz messen willst ist dein Messintervall sowieso groß, d.h. du 
kannst das nächste Messintervall zur Umrechnung nutzen (was Blödsinn ist 
für die eine popelige Division) bzw. eine Mikrosekunden große Pause 
(wenn überhaupt) zwischen zwei Messintervallen fällt überhaupt nicht ins 
Gewicht. Warum glaubst du optimieren zu müssen?
#3973510
Lesenswert?

Holger Krähenbühl schrieb:

> Da die Divisionen ja bekanntlich Rechenintensiv sind,

so so. Das ist bekannt.

Dein 72Mhz Bolide langweilt sich doch sowieso zu Tode um ein 60Hz Signal 
per Capture auszumessen! Von einer Flanke deines 60Hz Signals zur 
nächsten arbeitet diese CPU 1-Million 200-Tausend Takte ab.

Da kann er ruhig ein bischen dividieren und dafür 10 oder 20 Taktzyklen 
brauchen. Und wenn es 200 sind, ist das immer noch weit unter ferner 
liefen.
#3973528
Lesenswert?

Holger Krähenbühl schrieb:
> Da die Divisionen ja bekanntlich Rechenintensiv sind, möchte ich dies
> gerne Optimieren.
>
> MCU ist ein STM32F1x Cortex M3

Hast du den Cortex M3 zu 99,9% ausgelastet oder warum meinst du dir hier 
nicht eine Division oder gar eine Floating point leisten zu können?

Merke:
1. Man optimiert nur dann wenn etwas zu langsam ist.
2. Man versucht vor dem optimieren herauszufinden wo die meiste Zeit 
verplempert wird.

Der max. Wertebereich von uint32_t  ist 4 * 10^9.
Du könntest jetzt auch die Capture Werte erst durch 1000 teilen, oder 
64Bit long Werte nehmen oder einfach float benutzen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren