Forum: Mikrocontroller und Digitale Elektronik Cortex M4 - Warum klappt das mit dem Systick nicht?


von Florian A. (florian_a)


Lesenswert?

Guten Abend!

Ich will gerade die Floating Point Unit meines STM32F4 ausprobieren und 
schauen wie viel sie bringt etc.
Daher habe ich den Testcode geschrieben:

float fy,fz,fx,fa,fb,fc;
fy = 9.99f;
fa = 1456.78f;
fb = 23.7894f;
fc = 12378.975f;
fz = 8.88f;
SysTick->LOAD = 0x802C80;
SysTick->VAL = SysTick->LOAD;
SysTick->CTRL = 0b00000000000000000000000000000101;
fx = (float)(fy*fa+fb*fc+fz)*2.45;
if (fx>757173) GPIO_SetBits(GPIOA,GPIO_Pin_15);

Die if Zeile ist eigentlich nur dazu da einen Haltepunkt setzen zu 
können. Wenn ich nun im Debugger schaue ist dort SysTick_VAL 0x00802c7f.
Das kann ja nicht sein dass der nur einen Prozessortakt dafür benötigt.

Was ist da falsch?

Danke euch für Antworten!

von Gerhard G. (g_g)


Lesenswert?

Hallo,

hast du die FPU auf "Hard" oder "Soft" gesetzt?

schau mal diese Seite an:

Beitrag "Floating Pointing Unit STM32F4"




Gruß G.G.

von Hans (Gast)


Lesenswert?

Was sagt dein Simulator?

von Florian A. (florian_a)


Lesenswert?

Die Einstellung ARM FP ABI Type: None/Soft/Hard ändert leider garnichts 
an dem ganzen :( Habe Alle 3 Probiert!
Sonst ist eingestellt:

-Arm Architecture: v7EM
-Arm Core Type: Cortex-M4
-Arm FPU Type: FPv4-SP-D16
-GCC Target: arm-unknown-eabi


Viele Grüße!!

von Florian A. (florian_a)


Lesenswert?

Ich benutze die Crossworks IDE. Habe den Simulator noch nie benutzt, 
aber habe es eben probiert: Hier steht statt der 7F am ende gleich 80 
drin, also so als würde er gar keine Zeit dafür brauchen!

von Gerhard G. (g_g)


Lesenswert?

Hallo,

system_stm32f4xx.c

void SystemInit(void)
{
  /* FPU settings 
------------------------------------------------------------*/
  #if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
  SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and CP11 
Full Access */
  #endif

wenn dein Simulator/Debugger das Ziel erreicht und folgendes 
einschaltet:

SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2));  /* set CP10 and ..

ist alles ok!!

Gruß G.G.

von Arc N. (arc)


Lesenswert?

Florian A. schrieb:
> Die if Zeile ist eigentlich nur dazu da einen Haltepunkt setzen zu
> können. Wenn ich nun im Debugger schaue ist dort SysTick_VAL 0x00802c7f.
> Das kann ja nicht sein dass der nur einen Prozessortakt dafür benötigt.

Wenn sich fy, fz, fa, fb, fc nicht ändern können, kann der Compiler die 
überflüssige Berechnung wegoptimieren d.h. er macht an der Stelle nur 
noch die Zuweisung fx = 757173.irgendwas;


> Was ist da falsch?

Nichts.

von Florian A. (florian_a)


Lesenswert?

Okay, das war der springende Punkt: Optimization Level 1 :(
Habe nun auf Null geschaltet und siehe da, die Berechnung braucht mit 
Einstellung Soft 494 Zyklen und mit Hard 287 Zyklen. Ist das realistisch 
oder läuft die FPU wohl eher noch nicht richtig?

Schönen Abend und danke für alle Antworten!!

von Florian A. (florian_a)


Lesenswert?

Hurra :) :)
in CP10 steht 0b11 und in CP11 auch 0b11!

Danke euch Allen

von Arc N. (arc)


Lesenswert?

Florian A. schrieb:
> Okay, das war der springende Punkt: Optimization Level 1 :(
> Habe nun auf Null geschaltet und siehe da, die Berechnung braucht mit
> Einstellung Soft 494 Zyklen und mit Hard 287 Zyklen. Ist das realistisch
> oder läuft die FPU wohl eher noch nicht richtig?

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0439b/BEHJADED.html
(für die Berechnung wären das zu viele)

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.