ich versuche gerade hier, die Eigenarten eines speziellen
Microcontrollers in Quellcode festzuhalten, und hab dabei ein Problem
festgestellt:
Der Speicherbus dieses uC ist geteilt und geht zum Teil direkt in
Register periphärer Einheiten. Manche dieser Register sind read only,
was ich dem Compiler dadurch signalisiere, dass die fraglichen Variablen
den Specifier "const volatile" erhalten. Manche sind read/write, die
bekommen nur ein volatile. Aber wie soll ich bitteschön dem Compiler
signalisieren, dass manche dieser Register write-only sind? Ich meine,
volatile ist schon mal klar: Ein Schreibvorgang dorthin muss auf jeden
Fall ausgeführt werden und darf nicht wegoptimiert werden (bloß weil
z.B. wenige Zeilen weiter unten wieder was anderes reingeschrieben
wird). Aber sonst? Kann ich dem Compiler überhaupt sagen, dass das
Auslesen des fraglichen Speichers irgendwas zurückliefert, das nicht
notwendigerweise das ist, was vorher reingeschrieben wurde, und in
keinem Fall irgendwas, mit dem der Programmierer oder der Compiler was
anfangen kann? Wenn ja, wie?
Tschö,
Markus
--
Nur weil ein Genie nix reißt, muß ja nun nicht gleich jeder Idiot
pausieren... Bully hats ja auch geschafft.
-- gUnter nanonüm in de.alt.anime
> Aber wie soll ich bitteschön dem Compiler
> signalisieren, dass manche dieser Register write-only sind?
In ISO-C gar nicht.
Ob Dein Compiler entsprechende Erweiterungen bietet, sollte im Handbuch
stehen. Hier sind sie off topic.
Gruß. Claus
Markus Wichmann <null...@gmx.net> wrote:
> ich versuche gerade hier, die Eigenarten eines speziellen
> Microcontrollers in Quellcode festzuhalten, und hab dabei ein Problem
> festgestellt:
> Der Speicherbus dieses uC ist geteilt und geht zum Teil direkt in
> Register periphärer Einheiten. Manche dieser Register sind read only,
> was ich dem Compiler dadurch signalisiere, dass die fraglichen Variablen
> den Specifier "const volatile" erhalten. Manche sind read/write, die
> bekommen nur ein volatile. Aber wie soll ich bitteschön dem Compiler
> signalisieren, dass manche dieser Register write-only sind?
Durch einen entsprechenden Kommentar (zusaetzlich zum "volatile") ...
> Ich meine, volatile ist schon mal klar: Ein Schreibvorgang dorthin muss
> auf jeden Fall ausgeführt werden und darf nicht wegoptimiert werden (bloß
> weil z.B. wenige Zeilen weiter unten wieder was anderes reingeschrieben
> wird).
"Volatile" garantiert dir das IIRC nur, wenn du nicht auf die Schnapsidee
kommst, den Wert zwischen 2 Sequenzpunkten mehrfach zu aendern ...
> Aber sonst? Kann ich dem Compiler überhaupt sagen, dass das Auslesen des
> fraglichen Speichers irgendwas zurückliefert, das nicht notwendigerweise
> das ist, was vorher reingeschrieben wurde, und in keinem Fall irgendwas,
> mit dem der Programmierer oder der Compiler was anfangen kann?
AFAIK nein. Es gibt meines Wissens keine Moeglichkeit, eine Variable als
"write-only" zu deklarieren. Du wirst meines Erachtens nach selbst darauf
achten muessen, diese Register nicht auszulesen.
Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...
Also wieder das Kontrollprinzip "Programmierer weiß, was er tut." Trifft
man bei C ja ausreichend häufig an (was mir übrigens auch lieber ist).
> "Volatile" garantiert dir das IIRC nur, wenn du nicht auf die Schnapsidee
> kommst, den Wert zwischen 2 Sequenzpunkten mehrfach zu aendern ...
>
In dem Fall ist das Verhalten des Compilers doch sowieso undefiniert,
oder?
>> Aber sonst? Kann ich dem Compiler überhaupt sagen, dass das Auslesen des
>> fraglichen Speichers irgendwas zurückliefert, das nicht notwendigerweise
>> das ist, was vorher reingeschrieben wurde, und in keinem Fall irgendwas,
>> mit dem der Programmierer oder der Compiler was anfangen kann?
>
> AFAIK nein. Es gibt meines Wissens keine Moeglichkeit, eine Variable als
> "write-only" zu deklarieren. Du wirst meines Erachtens nach selbst darauf
> achten muessen, diese Register nicht auszulesen.
>
OK. Dann kann ich mich ja bestätigt fühlen.
> Tschuess,
> Juergen Ilse (jue...@usenet-verwaltung.de)
Naja, man kann ja sowieso nicht alle Hardwaremacken in der Programmier-
sprache abbilden. "Mein" Controller hat z.B. auch Register, wo ein paar
Bits read-only sind, ein paar sind write-one-to-clear, ein paar sind
normal schreibbar. Wie wöllte man das abbilden? Da kommt halt ein
Treibermodul drumherum, welches alles Wissen über diese Hardwareeinheit
bündelt, und fertig. Das hat dann eben eine 'set_palette_entry'-, aber
keine 'get_palette_entry'-Funktion (um mal ein populäres write-only-
Register zu zitieren :-).
>>"Volatile" garantiert dir das IIRC nur, wenn du nicht auf die Schnapsidee
>>kommst, den Wert zwischen 2 Sequenzpunkten mehrfach zu aendern ...
>
> In dem Fall ist das Verhalten des Compilers doch sowieso undefiniert,
> oder?
Yep.
Stefan