Ich habe gerade mal die Geschwindigkeit der sinf() - Funktion mit
folgndem Progrämmchen getestet:
1 | volatile float f = 0.0f;
|
2 | float phi = 0.0f;
|
3 | float dphi = 0.1f;
|
4 | volatile uint32_t start, dt;
|
5 | start = uwTick;
|
6 | for (uint32_t i=0; i< 100000;i++) {
|
7 | f += sinf(phi);
|
8 | phi += dphi;
|
9 | }
|
10 | dt = uwTick - start;
|
Die volatile sind notwendig, damit der Compiler die Schleife nicht
wegoptimiert. dt enthält die vergangene Zeit in Millisekunden.
Bei 48MHz CPU-Takt bekomme ich dt= 5948 ms. Ersetze ich den Ausdruck
sinf(phi) durch phi, braucht der STM nur 33ms. Daraus folgt, dass eine
Sinusfunktion 59µs, also über 2800 Takte benötigt. Wie kann das sein?
Meine Vermutung ist, dass die Mathematikbibliothek die
Gleitkommahardware nicht nutzt. Leider habe ich keinen Sourcecode.
Die Hardware floating point unit ist aktiviert (-mfloat=abi-hard), die
Linker-Option -lm ist aktiv.