Also es sieht zumindes so aus ,da der Teil in der Schleife nicht
ausgeführt wird und keine ausgabe kommt.Die stelle //uart_puts(input);
ist im übrigen nicht auskommentiert in der Version die ich Flashe.
Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,
dann:
1
for(;;)
2
{
3
__asm____volatile__(""::);
4
}
Das geht zumindest für alle GCC. Aber am erzeugten Maschiinencode wirst
du da kein Unterschied sehen, weil eine Schleife über nix ist immer noch
eine Schleife über nix. Well also Oprtationen in der Schleife
drinstehen, die keine Wirkung auf die abstrakte Maschine haben, kann
ein Compiler diese dennoch rauswerfen.
Johann
Johann L. schrieb:
> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,
Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich
würde das den Programmablauf unzulässig verändern.
Stefan Ernst schrieb:
> Johann L. schrieb:>> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,>> Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich> würde das den Programmablauf unzulässig verändern.
Ja, stimmt. Aber auch bei sowas bringt es nicht unbedingt was:
1
for(inti=0;i<100;i++)
2
{
3
__asm____volatile__(""::);
4
}
Der Compiler könne die Schleife aufrollen, und 100*nix ist eben auch
nix...
Johann
schau mal in den Code:
schreibzeiger == lesezeiger! Damit gibt Deine checkroutine immer 0
zurück => die if aberfrage in der for(;;) Schleife ist immer false. Und
uart_getc wird erst innerhalb der if Abfrage ausgeführt.
EDIT: Das sei() bringt nicht viel, da Du keine ISRs zur Verfügung
stellst.
Stefan Ernst schrieb:
> Johann L. schrieb:>> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,>> Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich> würde das den Programmablauf unzulässig verändern.
Dadrauf bezog dein Vorposter sich mit 'Abstrakter Maschine'.
Sven P. schrieb:
> Stefan Ernst schrieb:>> Johann L. schrieb:>>> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,>>>> Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich>> würde das den Programmablauf unzulässig verändern.>> Dadrauf bezog dein Vorposter sich mit 'Abstrakter Maschine'.
Ich verstehe nicht so ganz, was du mir damit sagen willst. Ob die
Maschine nun abstrakt oder real ist, spielt in diesem Zusammenhang doch
keine Rolle.
Mach den Code als Dateianhang (*.c) und dann sag konkret, welche Zeile
(Nummer) er Deiner Meinung nach wegoptimiert.
In der Regel hat er aber einen Grund, wenn er das macht. D.h. wenn Du
ihn durch irgendetwas zwingst, es nicht zu tun, wird trotzdem nichts
anderes passieren.
Es sei denn, es ist ein volatile-Fehler. Die kann man einfach mit der
Optimierung -O0 rauskriegen.
Peter
nicht mit Registerversionen der Pointer zufrieden gibt, die längst
obsolet sind, weil sie in der ISR verändert wurden.
In Summe solltest du allerdings beides volatile machen: Die Pointer, als
auch das, worauf die Pointer zeigen:
1
volatileuint8_t*volatilelesezeiger;
2
volatileuint8_t*volatileschreibzeiger;
Was ist mit der ISR? Wird sie aufgerufen (sprich: kriegst du das Echo
von dort)? Hast du das gegengechecked, also zb ein anderes Echo
zurückschicken; Nicht dass du einem lokalen Echo deines Terminals
aufsitzt.
>> Johann L. schrieb:>>> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,>>>> Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich>> würde das den Programmablauf unzulässig verändern.
habt ihr gelesen was der Originalposter will?
>Sowohl der Pointer selbst, als auch das worauf er zeigt, müssen volatile>sein.
das glaube ich jetzt erst Mal nicht, zumindest hat das nichts mit dem
Problem zu tun
wird die ISR überhaupt ausgeführt?
Walter schrieb:
> das glaube ich jetzt erst Mal nicht, zumindest hat das nichts mit dem> Problem zu tun
Denke schon, denn der Compiler wird uart_puffer_check() wahrscheinlich
inlinen und dann feststellen, dass diese Funktion aufgrund seiner
Kenntnis der Werte der beiden Pointer stets 0 zurück gibt.
Walter schrieb:
>>Sowohl der Pointer selbst, als auch das worauf er zeigt, müssen volatile>>sein.> das glaube ich jetzt erst Mal nicht, zumindest hat das nichts mit dem> Problem zu tun
Ach.
Und was denkst du, wird passieren, wenn sich der Compiler
1
if(uart_puffer_check()==1)
2
3
...
4
5
uint8_tuart_puffer_check(void)
6
{
7
if(schreibzeiger!=lesezeiger)
8
return1;
9
elsereturn0;
10
}
dafür entscheidet, die Pointer nicht neu aus dem Speicher zu holen,
sondern mit Registerversionen derselben den uart_puffer_check
durchzuführen.
Das kommt dann besonders gut, wenn die ISR (so sie überhaupt aufgerufen
wird) die Speicherversionen der Pointer verändert, die Überprüfung aber
mit Registerversionen stattfindet :-)
Variablen, die aus einer ISR heraus verändert werden, müssen volatile
gemacht werden. schreibzeiger ist eine Variable. Sie wird in der ISR
verändert und in main() abgefragt. Also muss man sie volatile machen.
Die Tatsache, dass schreibzeiger ein Pointer ist, spielt dabei erst mal
keine Rolle. Und die Syntax dafür ... siehe oben.
mit dem bin ich ja einverstanden:
uint8_t* volatile lesezeiger;
uint8_t* volatile schreibzeiger;
aber wofür soll das sein:
volatile uint8_t* volatile lesezeiger;
volatile uint8_t* volatile schreibzeiger;
Walter schrieb:
> mit dem bin ich ja einverstanden:> uint8_t* volatile lesezeiger;> uint8_t* volatile schreibzeiger;>>> aber wofür soll das sein:> volatile uint8_t* volatile lesezeiger;> volatile uint8_t* volatile schreibzeiger;
Dann mach dich mal mit den Regeln vertraut, wie volatile (oder auch
'const') angewendet werden.
Hinweis:
Bei Pointern ist sowohl bei const als auch bei volatile die Frage zu
beantworten: Wer ist denn eigentlich const (bzw. volatile)? Der Pointer
oder das worauf er zeigt? Oder vielleicht beides?
Stefan Ernst schrieb:
> Johann L. schrieb:>> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,>> Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich> würde das den Programmablauf unzulässig verändern.
Richtig. Ein Compiler, der so "optimiert" waere fehlerhaft. Und das
glaube ich hier nicht. Vielleicht hast Du ja einen Programmabsturz
verursacht...
Michael G. schrieb:
> Stefan Ernst schrieb:>> Johann L. schrieb:>>> Wenn du eine leere Schleife haben willst, die nicht wegoptimiert wird,>>>> Ein leere Endlosschleife wird niemals wegoptimiert werden, schließlich>> würde das den Programmablauf unzulässig verändern.>> Richtig. Ein Compiler, der so "optimiert" waere fehlerhaft.
Wieso? Wenn der Programmfluß nicht an die Stelle kommt kann DCE (dead
code elimination) auch Endlosschleifen wegwerfen.
Dann sieht man den Code nicht, der da ansonsten übersetzt werden würde.
Aber Fehler ist das keiner.
Johann