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
Was würde denn im Assemblercode darauf hindeuten, dass die FPU verwendet wird?
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?
Manchmal kommt man nicht drumherum, selbst in die Doku zu schauen... Versuchs mal mit http://www.atmel.com/images/doc32002.pdf
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.