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.
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.
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.
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.
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)
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).
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".
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.