Forum: Compiler & IDEs AVR-GCC: Generische Zeiger?


von Kabeljau (Gast)


Lesenswert?

- Im AVR-GCC C gibt es keine Zeiger, die wahlweise ins RAM oder ins 
ROM(Flash) zeigen.

- Wenn man Zeiger ins RAM und Zeiger ins ROM hat, dann müssen 
entsprechende Funktionen (z. B. Ausgabe) doppelt geschrieben werden.

Liege ich mit den beiden Aussagen richtig?

Wie kann ich vorgehen? Zu allen Zeigern eine Struktur kreieren, in der 
notiert wird, ob es sich um einen RAM- oder ROM-Zeiger handelt?

von Falk B. (falk)


Lesenswert?

@Kabeljau (Gast)

>- Im AVR-GCC C gibt es keine Zeiger, die wahlweise ins RAM oder ins
>ROM(Flash) zeigen.

Falsch, die gibt es schon eine ganze Weile.

https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Jenseits_von_flash

_memx ist das Zauberwort

>- Wenn man Zeiger ins RAM und Zeiger ins ROM hat, dann müssen
>entsprechende Funktionen (z. B. Ausgabe) doppelt geschrieben werden.

Ja, das war bisher bei den meisten Funktionen so, die Flash-ROM 
VErsionen haben die Endung _P

>Wie kann ich vorgehen? Zu allen Zeigern eine Struktur kreieren, in der
>notiert wird, ob es sich um einen RAM- oder ROM-Zeiger handelt?

Siehe oben.

von Kabeljau (Gast)


Lesenswert?

@ Falk

> _memx ist das Zauberwort

Vielen Dank für den Link.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

__memx ist aber ein 24-Bit Zeiger.  printf_P funktioniert damit 
ebensowenig wie printf!

Wenn du __memx verwenden willst dann brauchst du dafür eigene 
Funktionen.

von Falk B. (falk)


Lesenswert?

Hmm, sollte man das nicht besser im Artikel ergänzen?

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn jemand nicht rafft, dass ein 16-Bit Zeiger etwas anderes ist als 
ein 24-Bit Zeiger dann hilft es wohl auch nix, das extra zu erwähnen...


Wenn du meinst der Artikel gewinne dadurch dann mach eben.

von Falk B. (falk)


Lesenswert?

@ Johann L. (gjlayde) Benutzerseite


>Wenn jemand nicht rafft, dass ein 16-Bit Zeiger etwas anderes ist als
>ein 24-Bit Zeiger dann hilft es wohl auch nix, das extra zu erwähnen...

Naja, die Formulierung

"Ausserdem ist zu beachten, dass __memx-Zeiger zwar 24-Bit Zeiger sind, 
die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard 
erfolgt, also als 16-Bit Arithmetik."

könnte zu einem Irrtum verleiten.

>Wenn du meinst der Artikel gewinne dadurch dann mach eben.

Ich war mal so frei.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Falk B. schrieb:
> "Ausserdem ist zu beachten, dass __memx-Zeiger zwar 24-Bit Zeiger sind,
> die zugrundeliegende Adress-Arithmetik jedoch gemäß dem C-Standard
> erfolgt, also als 16-Bit Arithmetik."
>
> könnte zu einem Irrtum verleiten.

Das bezieht sich aber auf etwas ganz anderes, nämlich dass es nicht 
möglich ist, Objekte > size_t zu haben.  Selbst wenn du solche Dinge, 
die > 32 KiB sind, etwa per Assembler anlegt, wird man auch mit __memx 
nicht gescheit darauf zugreifen können.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.