Compilerfehler?

OP #4493858
Lesenswert?
• ▲
▼
Jaja ich weiß, die meisten "Compilerfehler" sitzen vor der Tastatur ;-) 
Der hier scheint echt zu sein.

Mit eingeschalteter Optimierung (-O1 oder -Os) wird die Berechnung von 
bandwidth in sdram_speed_test() nicht ausgeführt, ohne Optimierung geht 
es.
1
    time = TCD0.CNT;
2
    PRINT("DMA transfer time is %u timer clocks.\r\n", time);
3
    bandwidth = size * 1024L / (2*time);
4
    PRINT("Bandwidth is %u kB/s.\r\n", bandwidth );

Die sehr ähnliche Funktion sdram_speed_test_dma()hat diesen Fehler 
nicht! Siehe Anhang.

Ich arbeite mit Atmelstudio 6.2 und dem darin enthaltenen avr gcc 4.8.1 
(Atmel Toolchain), das Ziel ist ein ATXmega128A1 (ohne U).
Angehängte Dateien:
OP #4493901
Lesenswert?
• ▲
▼
@ The Daz (thedaz)

>Ich würde darauf tippen, dass weil size immer 0 ist, diese Berechnung
>von bandwidth nicht stattfinden muss sondern ebenfalls immer 0 ergibt.

Das geht nicht, denn es ist eine Funktion. Wenn man ins .lss File 
(Ausschnitt) sieht, dann fehlt die Berechung von bandwidth vollständig!
#4493949
Lesenswert?
• ▲
▼
Falk B. schrieb:
> @ The Daz (thedaz)
>
>>Ich würde darauf tippen, dass weil size immer 0 ist, diese Berechnung
>>von bandwidth nicht stattfinden muss sondern ebenfalls immer 0 ergibt.
>
> Das geht nicht, denn es ist eine Funktion. Wenn man ins .lss File
> (Ausschnitt) sieht, dann fehlt die Berechung von bandwidth vollständig!

Ich glaube, du unterschätzt die Compiler-Optimierung gewaltig.
Moderator #4493977
Lesenswert?
• ▲
▼
Falk B. schrieb:
> Mit eingeschalteter Optimierung (-O1 oder -Os) wird die Berechnung von
> bandwidth in sdram_speed_test() nicht ausgeführt, ohne Optimierung geht
> es.

Die 0 sollte auch bei abgeschalteter Optimierung ausgegeben werden, nur
dass sie dann eben aufwendig berechnet wird. Bei eingeschalteter
Optimierung hingegen kennt der Compiler das Ergebnis dieser Berechnung
schon zur Compilezeit, weswegen er die Berechung im kompilierten Code
komplett weglässt und stattdessen das Ergebnis (die 0) direkt
hineinschreibt.

Ersetze einfach die Zeile

1
    for (; size; start_adr++, size--) {

durch

1
    for (uint16_t i=size; i; start_adr++, i--) {

und alles wird gut :)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.