Gast
#4861062
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.
|
Anzeige
|
Arduino AVR GCC strings im Flash ohne Progmem
Gast
#4861062
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.
Gast
#4861073
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
#4861082
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.
Gast
#4861134
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
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
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
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... bla bla bla Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|