Forum: Mikrocontroller und Digitale Elektronik FPU einheit AT32UC3C


von Gert (Gast)


Lesenswert?

Hallo!

Ich programmiere einen AT32UC3C mit Atmel Studio 6.1:
http://www.atmel.com/Images/doc32117.pdf

Ich mach sehr viel Berechnungen mit doubles. Da dieser µC eine FPU 
besitzt, würde ich gerne wissen, wie man diese nutzen kann? Wie kann ich 
die aktivieren oder ist die standardmäßig sowiso aktiv?

Dank, lG

von wendelsberg (Gast)


Lesenswert?

Gert schrieb:
> oder ist die standardmäßig sowiso aktiv?

Diese Frage kannst Du Dir selbst beantworten, wenn Du im erzeugten 
Assemblercode nachsiehst.

wendelsberg

von Gert (Gast)


Lesenswert?

Was würde denn im Assemblercode darauf hindeuten, dass die FPU verwendet 
wird?

von Gert (Gast)


Lesenswert?

Hat denn diese FPU einheit noch niemand von Euch genutzt?

Ich habe nun bei den ProjektProperties unter Toolchain -> Miscellaneous 
-> other flags: zusätzlich  -mhard-float eingegeben.

Es macht jedoch keine Unterschied im Output (Größe des 
Programmspeichers), wenn ich mit oder ohne  -mhard-float kompilliere.

von Optimax (Gast)


Lesenswert?

Hi,

ich habe die FPU vom UC3C schon mal für einen Regler benutzt, der intern 
mit bezogenen Größen arbeitet[...].

Sofern Du Atmel Studio 6.x? benutzt, wird automatisch die FPU aktiviert, 
das hat man geändert. Da gibts auch von Atmel noch eine AppNote zu 
(igrendwas mit der Linkereinstellung -mhard-float).

Du schreibst du verwendest viele Double-Operationen, da wird dir die FPU 
möglicherweise keinen allzu großen Geschwindigkeitsvorteil bringen, weil 
die nämlich nur Single-Precision macht.(ieee 754)
Implementiert sind Typumwandlung, +,-, Multiplikation, aber KEINE 
Division
-> möglichst alle Divisionen durch Multiplikationen ersetzen.

Im Assembler-Listing müsste sowas z.B stehen
cop == Coprozessor
 |
cop  cp0,cr0,cr14,cr12,0x58

VG
Optimax

von Gert (Gast)


Lesenswert?

Hi,

Danke für dei Info!

Deswegen bemerke ich vermutlich keinen Unterschied im Programmspeicher, 
wenn ich nun -mhard -float bei den Compileroptionen hinzufüge.

Werde im Assemlebrcode gleich mal nachsehen, mit und ohne -mhard-float.

Das würde bedeuten, dass diese Einheit nur Geschwindigkeitsvorteile 
bringt, wenn man float verwendet, nicht aber bei double, ist das 
korrekt?

LG

von jetzt (Gast)


Lesenswert?

Ich denk schon. Es ist auch relativ schwer vermittelbar, weshalb man 
double auf einem Controller braucht. Fuer einen Regler ja nicht. Single 
Precision ist auch schwer vermittelbar. Und dann noch in Hardware. 3D 
Transformationen in Echtzeit?

von Gert (Gast)


Lesenswert?

Was meinst du mit schwer vermittelbar?

von Optimax (Gast)


Lesenswert?

Naja, man kann schon double und auch floats benutzten. Das was dagegen 
spricht sind meist die zeitl. Anforderungen an das System im Sinne von 
Echtzeit und die Genauigkeit über Wertebereich (Sensoren & Aktoren).
Wenn man sich darüber im klaren ist, kann man das problemlos verwenden.

In welchem Bereich liegen denn die maximalen und minimalen Werte?
Oder anders, was hast du überhaupt vor zu berechnen, dass Du gleich 
double brauchst. Reicht nicht float aus?

von Gert (Gast)


Lesenswert?

Es geht nur um eine Regelung, also werde ich wohl mit float auskommen...

von Gert (Gast)


Lesenswert?

Optimax schrieb:
> Naja, man kann schon double und auch floats benutzten.

D.h. die FPU funktioniert nun doch auch für double oder wie soll ich das 
verstehen?

von Martin H. (marrtn)


Lesenswert?

Manchmal kommt man nicht drumherum, selbst in die Doku zu schauen...

Versuchs mal mit http://www.atmel.com/images/doc32002.pdf

von Gert (Gast)


Lesenswert?

Hallo,
darin steht:
"Newer versions of UC3 CPU introduced optional floating-point hardware 
performing 32-bit floating-
point operations"

32 Bit, d.h. es funktioniert nur für float, nicht aber für double, 
richtig??

von Gert (Gast)


Lesenswert?

Kann das jemand bestätigen?

von Martin H. (marrtn)


Lesenswert?

In dem Dokument ist auch aufgeführt, woher die Operanden der 
FPU-Kommandos kommen und wohin die Ergebnisse gehen --> Register. Und es 
steht auch drin, wie groß die Register sind --> 32 bit.

Wenn Du's lieber ausprobierst: Mach' doch einfach ein Programm, in dem 
mit doubles und floats gerechnet wird und schau Dir den Assembler-Output 
des Compilers an, was er aus den double-Rechnungen und was er aus den 
float-Rechnungen macht.

von Gert (Gast)


Lesenswert?

Und in diese 32Bit Register passen keine doubles richtig? Also 
funktioniert das nur für floats, und nicht für doubles, richtig?

Ich kenn mich in Assembler leider nicht gut genug aus, um das aus dem 
code beurteilen zu können...

Danke

von Martin H. (marrtn)


Lesenswert?

Gert schrieb:
> Und in diese 32Bit Register passen keine doubles richtig?

Exakt...

Gert schrieb:
> Ich kenn mich in Assembler leider nicht gut genug aus, um das aus dem
> code beurteilen zu können...

Nur so als Tip: Befasse Dich ein bisschen damit. Du musst nicht in 
Assembler programmieren können (kann ich auch nicht), allerdings ist ein 
grundlegendes Verständnis sehr hilfreich.

In diesem Fall reicht es, zu schauen, ob die FPU benutzt wird, d.h. ob 
"cop"-Befehle verwendet werden. Wenn man es genauer wissen will, kann 
man dem Compiler mit "-M decode-fpu" sagen, dass er die FPU-Kommandos in 
lesbarer Form hinschreiben soll.
Zum Vergleich float vs. double kann man sich die Länge des generierten 
Assemblercodes (Anzahl der Kommandos) anzuschauen.

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.