Variablen und der Optimierer - WINAVR

01/01/2011 - 18:12 von Björn G. | Report spam
Prost Neujahr erst einmal an Alle!



Muß jetzt mal mein erstes Leid in 2011 klagen ;-)

Seit zwei Tagen bin ich daran den Grund für ein sporadisches Byte
auslassen der UART zu begründen.

Gerade vor 5min habe ich den Fehler bei mir im Code entdeckt.

Ich fahre derzeit mit 250k Baud zwischen einem ATMega168 / FTD232R und
dem PC.

Sporadisch wenn ich etwas an den uC sende, "verlegt" dieser plötzlich
ein Byte des Streams und der Befehl kann somit nicht aufgelöst werden -
Der uC sendet dann ein NAK zurück.

Nachdem ich etliche Zeilen Code aus der ISR verbannt hatte (die
eigentlich nicht zeitkritisch waren) ist mir dann aufgefallen, das ohne
Optimierung auf Speed die UART wie gewünscht funktioniert.

Ich habe in der UART ISR zwei Variablen die die empfangenen Bytes
hàndeln (uart_stream & uart_data).

Keine ist global, sondern nur in der ISR benutzbar.

Leider habe ich es verpennt das uart_stream Array als static zu deklarieren.
Somit ist bei jedem neuen Byte das Array wieder leer :)
ABER NUR wenn man den Optimizer auf Speed stellt!
Ohne Optimizer funktioniert das Array wie vorgesehen...

Kann mir das bitte einmal jemand erklàren?

Björn
 

Lesen sie die antworten

#1 Frank Buss
01/01/2011 - 18:17 | Warnen spam
"Björn G." wrote:

Prost Neujahr erst einmal an Alle!



Ebenso.

Ich habe in der UART ISR zwei Variablen die die empfangenen Bytes
hàndeln (uart_stream & uart_data).

Keine ist global, sondern nur in der ISR benutzbar.

Leider habe ich es verpennt das uart_stream Array als static zu deklarieren.
Somit ist bei jedem neuen Byte das Array wieder leer :)
ABER NUR wenn man den Optimizer auf Speed stellt!
Ohne Optimizer funktioniert das Array wie vorgesehen...

Kann mir das bitte einmal jemand erklàren?



Kann Zufall sein. Wenn die Variablen nicht static sind, dann werden die auf
dem Stack angelegt. Da kann dann je nach Optimierung anderer Müll stehen,
oder auch die Werte vom letzen mal.

Oder greifst du auf das Array auch außerhalb der Interruptroutine zu, also
als FIFO? Dann musst du die als volatile deklarieren.

Frank Buss, http://www.frank-buss.de
piano and more: http://www.youtube.com/user/frankbuss

Ähnliche fragen