Arduino AVR GCC strings im Flash ohne Progmem

Gast
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.
Gast
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.
Persönliche Seite
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
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
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

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.