Das ist so nicht richtig.
Der Compiler muß, wenn eine Variable volatile ist, damit rechnen, daß sie außerhalb des aktuellen Programmkontextes geändert werden kann. Da sie aber wieder überschrieben wird, ist dreimal schreiben logisch das gleiche wie einmal schreiben, solange nicht gelesen wird. Er darf zwischen zwei Lesevorgängen die Variable nicht in einem Register halten, sondern muß sie immer neu lesen. Hier wird nie gelesen, also ist alles korrekt.
Es könnte funktionieren, wenn statt einer Konstanten eine Variable geschrieben würde. Diese müsste dann aber volatile sein, damit der Compiler nicht davon ausgehen kann, daß sie konstant ist. Oder man schreibt die Elemente eines Arrays auf den Port.
Das läßt sich in einer höheren Sprache nicht formulieren. Die Ausführungszeit läßt sich nicht vorgeben. Eine höhere Programmiersprache garantiert die logische Richtigkeit der Programmausführung, nicht mehr. Bei einem einfachen µC kann man sich mit Assembler helfen, bei einem größerem System mit mehreren (auch internen) Bussen oder Busmastern (z.B. DMA) geht das dann auch nicht mehr. Da hilft nur noch dedizierte Hardware, im einfachsten Fall ein (Timer)Interrupt.also eben mehrfach das gleiche, dann optimiert das der GCC auf nur einen Ausdruck, was ja prinzipiell auch sinnvoll ist. Doch das darf bei mir nicht sein, weil sich dann die Ausführungszeit ändert.
MfG Klebwax
Lesezeichen