Forum: Mikrocontroller und Digitale Elektronik Arduino AVR GCC strings im Flash ohne Progmem


von Markus (Gast)


Lesenswert?

Kann mir jemand sagen, ob man Strings beim AVR ohne PROGMEM ins Flash 
bekommen kann?

Der Grund: Ich würde gerne Platform-unabhängigen Code schreiben.

von Frank (Gast)


Lesenswert?

Markus schrieb:
> Kann mir jemand sagen, ob man Strings beim AVR ohne PROGMEM ins
> Flash bekommen kann?
>
> Der Grund: Ich würde gerne Platform-unabhängigen Code schreiben.

Dann definiere in einer Header z.B. so was:
#define FLASH PROGMEM

Wenn sich die Plattform ändert, musst du nur diese eine Header auf deine 
neue Plattform anpassen.

von Peter II (Gast)


Lesenswert?

Markus schrieb:
> Der Grund: Ich würde gerne Platform-unabhängigen Code schreiben.

geht nicht, weil Flash selber schon Platformabhängigen ist.

Frank schrieb:
> Dann definiere in einer Header z.B. so was:
> #define FLASH PROGMEM

reicht nicht, man muss auch bei den Zugriffen anders arbeiten.

von Frank (Gast)


Lesenswert?

Peter II schrieb:
> reicht nicht, man muss auch bei den Zugriffen anders arbeiten.

Na dann macht man halt noch eine plattformabhängig readFlash und 
writeFlash als inline in der gleichen Header.

von Εrnst B. (ernst)


Lesenswert?

ab Version 4.7 gibt's im GCC noch __flash als Alternative zu PROGMEM, 
die keine Verrenkungen mit pgm_read_xx benötigt.

AVR-GCC-Tutorial: Flash mit flash und Embedded-C

-> Probier doch mal, ob Arduino das auch schluckt (IAW: Ob der 
Arduino-AVR-GCC neu genug ist)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Nimm __flash für Definition, Deklaration und Zugriffe und dann
1
#if !defined __FLASH
2
#define __flash /* empty */
3
#endif
4
5
const __flash int a[] = { 1, 2 };
6
7
extern int foo (const __flash int*);
8
9
int func (const __flash * const __flash *p, int i)
10
{
11
   return **p + a[i] + foo (a);
12
}

Mit PROGMEM wird das blöder anzupassen, weil all die pgm_read_xxx 
nachprogrammiert werden müssen für nicht-avrlibc.

Oder, wenn ein Header zum Rausparametrisieren von __flash aus 
irgendwelchen Gründen "nicht geht", dann nimm Standard-C und lass die 
Daten in .rodata (bei avr dann im RAM).

von Markus (Gast)


Lesenswert?

Danke für eure Antworten

>Oder, wenn ein Header zum Rausparametrisieren von __flash aus
>irgendwelchen Gründen "nicht geht", dann nimm Standard-C und lass die
>Daten in .rodata (bei avr dann im RAM).

Das ist genau das Problem. Ein Atmega328 hat nur 2K RAM. Deshalb muss 
man relativ sparsam damit umgehen. Aus Codesicht ist es am einfachsten, 
einfach das Flash zu ignorieren und das Kopieren ins RAM auch. Aber dann 
ist bei der Benutzung von Strings ziemlich schnell "Ende Gelände".

von c-hater (Gast)


Lesenswert?

Markus schrieb:

> Der Grund: Ich würde gerne Platform-unabhängigen Code schreiben.

Dann hast du ein echtes Problem. Tatsache ist nämlich, dass es wirklich 
universell portablen Code nicht gibt und auch nicht geben kann.

Und die nötigen Frickeleien, um angeblich hochportable Sprachen wie C 
wirklich auf jedem Zielsystem benutzbar zu machen, zeigen das nur zu 
deutlich...

Nur eine einzige davon ist halt so'ne Scheisse wie etwa das Flash- oder 
Progmem-Attribute. Selbst wenn das jeder Compiler gleichermaßen 
verstehen und behandeln würde (was natürlich im RL nicht der Fall 
ist), wäre damit immer noch keine universelle Portibilität 
sichergestellt. Denn was passiert z.B. auf Systemen, die überhaupt keinn 
Flash haben?

Wie auch immer. Die Idee der universellen Portabilität ist eine reine 
Wunschvorstellung, ein unerreichbares Ideal. Damit musst du dich einfach 
abfinden...

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

bla bla bla

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.