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
Gert schrieb:> oder ist die standardmäßig sowiso aktiv?
Diese Frage kannst Du Dir selbst beantworten, wenn Du im erzeugten
Assemblercode nachsiehst.
wendelsberg
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.
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
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
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?
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?
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?
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??
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.
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
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.