Forum: Compiler & IDEs GCC, WinAVR, AVR-Studio 4.18: String im Flashspeicher


von Gerd (Gast)


Lesenswert?

Wie muss die Funktion F aussehen, damit der Compiler String1 nur im 
Flashspeicher anlegt?

PUTSTRING( F("String1") );

von Stephan B. (matrixstorm)


Lesenswert?

Hallo Gerd.

Ich denke du suchst nach dem, was PSTR() tut.
Siehe 
http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#ga05ca900ebf7cd121be73c654d9ccb3eb

Aber Achtung, die Verwendung klappt nur in den oberen 64K des Flashs 
zuverlaessig.
Und die Funktionen, in den du diese Art von String verwendest muessen 
damit umgehen koennen: I.A. [...]_P(...) Funktionen genannt.

MfG

: Bearbeitet durch User
von Rolf Magnus (Gast)


Lesenswert?

#define F PSTR

von Gerd (Gast)


Lesenswert?

Vielen Dank für die Infos. Es funktioniert :)

Was mich verwirrt:

> Aber Achtung, die Verwendung klappt nur in den oberen 64K des Flashs
> zuverlaessig.

von Stephan B. (matrixstorm)


Lesenswert?

Gerd schrieb:
> Was mich verwirrt:
>
>> Aber Achtung, die Verwendung klappt nur in den oberen 64K des Flashs
>> zuverlaessig.

Zeiger in AVR sind 16Bit breit. D.h. es konnen 65536 Bytes (position 
0x0000 bis 0xffff) addressiert werden.
Flash Speicher ist bei den AVRs allerding mitunter bereits groesser als 
64KB.

Ein Zeiger auf einen "Flash-String" jenseits der 64K Grenze wuerde auf 
falsche Daten referenzieren.

MfG

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Gerd schrieb:
> Was mich verwirrt:
>
>> Aber Achtung, die Verwendung klappt nur in den oberen 64K des Flashs
>> zuverlaessig.

Soll wohl heißen: In den unteren 64k.

von Stephan B. (matrixstorm)


Lesenswert?

Johann L. schrieb:
> Soll wohl heißen: In den unteren 64k.

Aehm oops, natuerlich, sorry.

Schlimm wenn schreiben und meinen so divergieren ;-)

MfG

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

Oberhalb von 64k geht auch, wenn gleich etwas umständlicher.

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Programmspeicher_.28Flash.29

Kapitel Variablenzugriff >64kB

von Stephan B. (matrixstorm)


Lesenswert?

Falk Brunner schrieb:
> Kapitel Variablenzugriff >64kB

Ja, vereinzelt kann man mit "elpm" aushelfen.

Die aktuelle avrlibc benutzt den aber nicht ueberall.
In diesen Zusammenhang ging es um Stringfunktionen_P.
(http://www.nongnu.org/avr-libc/user-manual/group__avr__stdio.html)

Diese funktionieren NICHT ueberhalbt 64K.

Ggf. kann man dem Compiler eine Subarchitektur (longavr?) beibringen, 
die einheitlich 3 oder 4 Byte Pointer einsetzt.
Freilich overhead...

...ggf. hat Joerg dazu eine Meinung ;-) Joerg?

MfG

: Bearbeitet durch User
von Falk B. (falk)


Lesenswert?

@ Stephan B. (matrixstorm)

>In diesen Zusammenhang ging es um Stringfunktionen_P.
>(http://www.nongnu.org/avr-libc/user-manual/group__...)

>Diese funktionieren NICHT ueberhalbt 64K.

Ach so. Das ging wohl nur mit pgm_read_byte etc. Hmm.

>Ggf. kann man dem Compiler eine Subarchitektur (longavr?) beibringen,
>die einheitlich 3 oder 4 Byte Pointer einsetzt.
>Freilich overhead...

Naja, vielleicht muss man irgendwann halt doch mal auf nen 32Bitter 
wechseln ;-)

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.