Hallo Community... Ich wollte gerade eine simple Gegenüberstellung von einigen AVRs und deren Berechnungszeit für eine "einfache" Rechnung aufstellen. Dafür habe ich einmal ergebnis = sqrt(465.983154/4135.964*sqrt(168*1256.942)); und einmal ergebnis = 1.0+1.0 gerechnet. Das ganze vorerst im Simulator. Was mich allerdings wundert: Egal was ich rechnen lasse, der Cyclecounter zeit immer 1 an und die StopWatch 60ns. Kennt zufällig jemand das Problem und kann mir weiterhelfen? Danke schonmal im Voraus. -- ATmega32@16Mhz AVR-Studio 5.1
Gast
#2605962
Einfaches Hilfsmittel: Pin setzen Funktion / Berechnung aufrufen Pin rücksetzen so kann man einfach die Abarbeitungszeit einer Funktion betrachen.
Das wäre doch nichts anderes als die Berechnung per Knopfdruck zu starten. Ich will aber die genau Zeit wissen.
Gast
#2605994
Da ich aufgrund deiner Beschreibung nichts sagen kann, bleibt nur der Hinweise auf das optionale (Dis-)Assembler-Listing . Mal eine Gegenfrage. Sind denn die AVR so unterschiedlich. Es kann doch nur einen Unterschied geben, wenn ein AVR-Typ beispielsweise einen Hardware-Multiplizierer besitzt und ein anderer nicht: ATTiny vs ATmega. (Die ganz alten lasse jetzt mal weg)
Gast
#2605996
>ergebnis = sqrt(465.983154/4135.964*sqrt(168*1256.942)); > >und einmal > >ergebnis = 1.0+1.0 >Das ganze vorerst im Simulator. Was mich allerdings wundert: Egal was >ich rechnen lasse, der Cyclecounter zeit immer 1 an und die StopWatch >60ns. Was machst du mit ergebnis? Nichts, dann optimiert der Compiler dir den ganzen Kram weg. Versuch mal volatile float ergebnis.
Hallo Rush, schau dir mal den Assemblercode an, den der Compiler erzeugt. Im besten Fall macht der Atmega nämlich nur ne Zuweisung, und der Compiler rechnet das vorher schon aus. aus wird
1 | |
wird dann
1 | |
und aus
1 | |
wird
1 | |
Was in der Ausführungszeit genau das gleiche ist! Ich bin mir jetzt nur nicht sicher, ob der Compiler so intelligent ist und kann die Funktion sqrt () rechnen. Aber das siehst du im Assemblercode. Und wenn du ergebnis nicht weiter benutzt, dann kann es dir passieren, dass der Compiler eh alles wegoptimiert. VG Thomas
Ich brauche diese Gegenüberstellung für die Vorlesung -.- Ich weiss, eigentlich totaler Quatsch aber was solls... Wollte das ganze auf diesen Typen laufen lassen: AT90S2313 ATtiny2313 ATmega8 - mega128 ATmega644 und 644P MSP430 Ich weiss nicht ob sich beispielsweise ein ATmega16 von dem Berechnungsalgorithmus von einem mega128 unterscheidet. Schätzungsweise nicht, aber muss es eben machen.
Gast
#2606014
Zu den verschiedenen Controllern gibt von TI ein PDF (inkl. Quellcode) im Anhang zu diesem App-Note. Hilft Dir zwar jetzt nicht...
Das hier ist praktisch der Teil für die berechnung und ausgabe:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
Assembler habe ich bis heute erfolgreich meiden können, von daher verstehe ich ihn nicht ;-) Thomas kannst du vielleicht drüber schauen? Habe den Assemblercode mal drangehängt.
Gast
#2606042
Hi Wenn in deinem Code vor sei(); ein timerinit(); steht, dann fehlt der Assemblercode für a = sqrt(465.983154/4135.964*sqrt(168*1256.942)); MfG Spess
der dazugehörige c-code sieht so aus:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
dann frage ich mich ehrlich gesagt wo meine Berechnung hin ist. denn im Assenblercode folgt nach dem sei() direkt das cli(). Und was hat denn mein timerinit() mit dem Berechnungsteil zu tun? Eigentlich doch nichts.
Gast
#2606059
Rush ... schrieb: > dann frage ich mich ehrlich gesagt wo meine Berechnung hin ist. wegoptimiert, der compiler hat es einfach ausgerechnet.
Hast recht. Habe jetzt die Optimierung ausgeschaltet. Jetzt kommt raus: ergebnis = 1.0 + 1.0 Cyclen: 13 StopWatch: 0,81 us bei ergebnis = sqrt(465.983154/4135.964*sqrt(168*1256.942)) kommen wieder die selben werte drin. und diesmal steht die berechnung im assemblercode auch drin. Kann doch wirklich nicht sein dass beide Berechnungen die selben Zeiten bringen...
Gast
#2606075
Rush ... schrieb: > Hast recht. Habe jetzt die Optimierung ausgeschaltet. Jetzt kommt raus: jetzt hast du aber auch keine sinnvollen ergebnisse mehr. Denn kein sinnvolles Programm wird ohne optimierung eingesetzt. du must also den compiler dazu bringen, mit optimierung zu rechnen.
na das ergebnis stimmt schonmal. du hast ja recht was die optimierung angeht. mir gehts einfach nur darum dass ich mit ein und denselben einstellungen das selbe programm auf mehreren controllern laufen lasse. einfach nur um die vergleichbarkeit zu schaffen. sicher, normalerweise gehört dort die optimierung mit rein. naja, mit wenn ich meine ergebnisvariable als volatile deklariere dann wird sie auch nicht wegoptimiert.
Gast
#2606107
Rush ... schrieb: > naja, mit wenn ich meine ergebnisvariable als volatile deklariere dann > wird sie auch nicht wegoptimiert. die variabel nicht, aber die berechnung kann dann genso weg optimiert werden. Es bleibt nur noch das ergebniss stehen.
sorry, hab mich falsch ausgedrückt. also die berechnung steht komplett im assemblercode drin
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.