Arduino AVR GCC strings im Flash ohne Progmem

Gast #4861073
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.
Persönliche Seite #4861175
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).
Gast #4861214
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".
Gast #4861439
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren