Beiträge von Unseen im Thema „Port-Befehl in C“

    Hmm, nein, das erlaubt nur einen beliebig geformten Adressraum (nur durch diese Restriktion sind z.B. Überlappungen innerhalb des Adressraums abbildbar -- der Adressraum muss nicht linear sein). Eine Konvertierung eines Integer Typs in einen Pointer ist wohldefiniert (mit implementierungsspezifischem Ergebnis), und das ist nur möglich, wenn man sich auf einen Adressraum beschränkt oder den Adressraum zum Teil des Pointer-Typs macht.

    Getaggte Pointer sind aber auch nicht so ungewöhnlich - meines Wissens benutzt Keil das auf dem 8051, um dessen Sammlung unterschiedlicher Adressräume in einem Pointertyp darstellen zu können.

    Zitat

    das geht nur über "qualifier", der C Standard sieht aber keine qualifier für verschiedene Adressräume vor. Genau da setzen entsprechende Extensions an und definieren eigene Qualifier (z.B. bei AVR PROGMEM für den Zugriff auf Programmspeicher).

    PROGMEM ist veraltet, inzwischen kann GCC auch mit explizit benannten Adressräumen umgehen. Es gibt zu dem Thema wohl eine Standarderweiterung speziell für eingebettete Systeme, die das normiert hat.

    Die Begründung würde ich nicht ganz so stehen lassen: C versucht ja gerade, von Unterschieden zwischen verschiedenen Maschinen zu abstrahieren. Sehr viele Maschinen-Details sind bewusst völlig offen gehalten.

    Genau.

    Zitat

    Allerdings hat man trotzdem ein paar wenige Dinge festgelegt, vermutlich um die Sprache simpel zu halten -- eine dieser Festlegungen ist: Es gibt genau einen Adressraum.

    Meines Wissens gibt es diese Festlegung nicht. Dagegen spricht beispielsweise, dass Grösser-/Kleinervergleich zweier Pointer nur in ausgewählten Situationen definiert ist und z.B. der >/<-Vergleich von Pointern, die von zwei unterschiedlichen Objekten abgeleitet wurden undefiniert ist - die könnten ja in zwei unterschiedlichen Adressräumen liegen, für die keine Ordnungsrelation existiert.

    Wie sieht in "C" ein Portbefehl bitte aus?

    C selbst kennt keinen Portbefehl weil es das Konzept von I/O-Ports nicht in gleicher Form auf jedem Rechner gibt. Falls dein Compiler dafür eine eigene Erweiterung bietet, sollte die in dessen Anleitung beschrieben sein.