Forum: Mikrocontroller und Digitale Elektronik C-Optimierung


von Holger K. (holgerkraehe)


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!

von ghl (Gast)


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?

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Holger Krähenbühl schrieb:
> Der Countertakt ist 72MHz

72 MHz in mHz-Schritten kannst Du in einem uint32_t nicht ausdrücken.

(72 Milliarden ist 18 mal so groß wie 2^32).

von Udo S. (urschmitt)


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.

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.