Forum: Mikrocontroller und Digitale Elektronik FPU auf STM32F4 (Cortex M4) zieht sehr viel Strom


von M. Н. (Gast)


Lesenswert?

Guten Tag,

ich habe ein etwas merkwürdiges Phänomen:

Ich habe eine Applikation auf einem STM32F407 geschrieben, die im 
Interruptcontext Floating point Operationen durchführt. (Ich weiß 
langsam bla bla. Ist mir aber erstmal egal. Vielleicht wird das noch in 
die Main-Loop verlagert).

Der Interrupt kommt von einem Timer-gesteuerten ADC und im Intterupt 
wird der ADC Wert durch Floating Point Arithmetik gefiltert (Tiefpass + 
Kerbfilter).

Das klappt auch einwandfrei.

Sobald ich in der Main-Loop auch Floating point Operationen verwende 
(quasi die gesamte Rechenzeit), steigt die Stromaufnahme meines STMs um 
ca. 10 mA an. Den absoluten Wert kann ich nicht sagen, da noch andere 
Dinge am Board hängen.

Sobald ich die Floating point Arithmetik in der Main-Loop wieder 
deaktiviere (nicht neu kompilieren; Ich kann über eine serielle 
Schnittstelle die Berechnungen deaktivieren) sinkt die Stromaufnahme 
wieder.

Nun ist meine Frage: Ist es normal, das FPU Operationen signifikant 
Strom benötigen? Durch die Nutzung der FPU im Hauptprogramm wird zudem 
im Interrupt nötig, dass die FPU Register gesichert werden (Lazy 
Stacking). Das ist auch zusätzlicher Aufwand. Aber, dass da gleich 10 mA 
zusammen kommen, kommt mir etwas spanisch vor. Bei den FPU Operationen 
handelt es sich lediglich um Additionen und Multiplikationen. Ich habe 
allerdings im Disassembly nicht nachgeprüft, ob der Compiler mir nicht 
noch was anderes komisches einbaut).

Könnt ihr bei euren Controllern soetwas auch beobachten?

Der STM ist bei Mouser gekauft (also zu 99% ein Original Teil). Habe 
noch ein weiteres Board mit einem Chip, den ich in China gekauft habe. 
Werde morgen versuchen, ob dieses Board dasselbe Verhalten zeigt.

Vielen Dank und gute Nacht
M. H.

von Johannes S. (Gast)


Lesenswert?

Was passiert denn sonst in der mainloop? Wenn die per WFI im Schlafmodus 
schlummert wird der Strom runtergehen.

von M. Н. (Gast)


Lesenswert?

Die Main-Loop ist eine while(1)-Schleife, die neben den Berechnungen 
noch so Dinge macht, wie den UART mit einer kleinen Konsole zu bedienen. 
Wenn die Berechnungen abgeschaltet sind läuft die Main-Loop quasi leer. 
In jedem Durchgang wird geschaut, ob über den Uart+DMA neue Daten kamen 
und ggf. verarbeitet. Ansonsten passiert (vorerst) nichts. Das Programm 
ist noch im werden.

von Pandur S. (jetztnicht)


Lesenswert?

ADCs filtert man als Integer ... was sollen floats ?

Mit integer benoetigt man eine Integer variable fest alloziert. Nicht 
mehr.

von Johannes S. (Gast)


Lesenswert?

Ja? Schonmal mit floats auf einem F407 gearbeitet?

von Bauform B. (bauformb)


Lesenswert?

ARM schreibt ohne weitere Erklärung
Note: Disabling the FPU might help to reduce power consumption.
evt. ist da mal was unangenehm aufgefallen.

Die main loop könnte ohne FPU-Berechnungen so kurz sein, dass sie 
komplett in den Cache passt. Dann sind keine Flash-Zugriffe nötig, wohl 
aber mit der "langen" Schleife. Das wäre bei 120 MHz ein Unterschied von 
11 mA. Na gut, das Datenblatt sagt das nicht wörtlich, aber man könnte 
es so interpretieren.

von M. Н. (Gast)


Lesenswert?

Joggel E. schrieb:
> Mit integer benoetigt man eine Integer variable fest alloziert. Nicht
> mehr.

Wie gesagt. Hier geht es nicht um die technisch beste Lösung. Ein flaot 
ist einfach zu nutzen, hinreichend schnell (da FPU) und mit den 
Nachteilen einer Flaoting Point Operation gegenüber Festkommaarithmetik 
kann ich leben. Somit ist das für mich die optimale Lösung.

Joggel E. schrieb:
> was sollen floats ?

Eine einfache Lösung bieten. Sollte ich an die Grenze der Rechenleistung 
des STMs gelangen werde ich vermutlich daran herumoptimieren. Aber davon 
bin ich soweit entfernt, wie die Erde von der Sonne.

Johannes S. schrieb:
> Ja? Schonmal mit floats auf einem F407 gearbeitet?

Ja. Aber noch nie die Stromaufnahme betrachtet dabei. Das Datenblatt 
schweigt sich leider aus über den Anteil der FPU. Nachdem einmal ein 
FPGA Board 160 W mehr als normal gezogen hat entwickelt man eine gewisse 
Paranoia gegenüber unerklärten Anstiegen der Stromaufnahme. Deshalb 
meine Frage.

von M. Н. (Gast)


Lesenswert?

Bauform B. schrieb:
> Die main loop könnte ohne FPU-Berechnungen so kurz sein, dass sie
> komplett in den Cache passt.

Der STM32F4 hat keinen Cache. Stattdessen nutzt STM den 
Flash-Accelarator (ART), um die Zugriffszeiten zu minimieren. Hatte den 
auch schon im Verdacht. Das war's dann aber nicht. Ist sehr sicher die 
FPU bzw. etwas in diesem Code Umfeld.

von Bauform B. (bauformb)


Lesenswert?

M. H. schrieb:
> Der STM32F4 hat keinen Cache.

Mein RM0090 sagt im Kapitel ART Accelerator™
1
Instruction cache memory
2
To limit the time lost due to jumps, it is possible to retain
3
64 lines of 128 bits in an instruction cache memory. This feature
4
can be enabled by setting the instruction cache enable (ICEN)

von Jim M. (turboj)


Lesenswert?

M. H. schrieb:
> Nun ist meine Frage: Ist es normal, das FPU Operationen signifikant
> Strom benötigen?

Nö.

Aber die FPU hat i.d.R. einen Interrupt, der bei FPU Exceptions 
getriggert wird. Und der verhindert dann das der Core bei WFI/WFE sich 
schlafen legen kann - selbst wenn der Interrupt nicht im NVIC aktiviert 
ist.

Abhilfe: FPU Exception Flags löschen vor WFI/WFE:
1
#define FPU_EXCEPTION_MASK 0x0000009F
2
__set_FPSCR(__get_FPSCR() & ~(FPU_EXCEPTION_MASK));
3
(void) __get_FPSCR();
4
NVIC_ClearPendingIRQ(FPU_IRQn);

von M. Н. (Gast)


Lesenswert?

Jim M. schrieb:
> Nö.

Habe es gerade mit einem zweiten Controller versucht. Verhalten der 
Stromaufnahme ist dasselbe.

Jim M. schrieb:
> Aber die FPU hat i.d.R. einen Interrupt, der bei FPU Exceptions
> getriggert wird. Und der verhindert dann das der Core bei WFI/WFE sich
> schlafen legen kann - selbst wenn der Interrupt nicht im NVIC aktiviert
> ist.
>
> Abhilfe: FPU Exception Flags löschen vor WFI/WFE:

Danke für den Tipp. Ist bei mir nur nicht die Ursache, da ich kein 
WFE/WFI nutze.

von M. Н. (Gast)


Lesenswert?

Habe jetzt noch ein wenig gedebuggt und kann folgendes sagen:

* Die Verwendung der FPU wirkt sich auf die Stromaufnahme aus. Aber 
nicht sehr drastisch. Ich konnte nur 1,5 mA beobachten und so sicher ist 
es auch nicht, dass das daher kommt... Ist schwierig zu isolieren.

* Die Große Stromänderung scheint tatsächlich vom ART zu kommen. In 
meiner Floating Point Rechnerei ist wird u.a. eine Lookuptabelle aus dem 
Flash verwendet. Ich habe diese testweise in den RAM gelegt. Dann sinkt 
die Stromaufnahme wieder. Unter Nutzung von WFI sinkt die Stromaufnahme 
erheblich, da die Mainloop von ca 250 Durchläufen pro ms auf 3 
Durchläufe pro ms sinkt.

Vielen Dank für eure Hilfe.

von Johannes S. (Gast)


Lesenswert?

ich hatte auch noch mal im CubeMX nachgesehen, da gibt es ja einen Power 
Calculator. Für die FPU war keine Auswahl vorhanden, danach geht die 
auch nicht signifikant in die Stromaufnahme ein. Aber Memory Fetch Type 
und DMA kann man einstellen und so auch die Änderungen sehen.

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.