Compilerfehler?

#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:
#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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren