ich versuche, einen einer Funktion als Parameter übergebenen String mit dem Makro PSTR aus der <avr/pgmspace.h> im Flash eines AVR Microcontrollers zu speichern.
Als Fehlermeldung bekomme ich (in Microchip Studio) "invalid initializer".
Sobald man PSTR einen String der Form "..." übergibt, funktioniert es.
Im Web konnte ich zu diesem Problem nichts finden, daher wäre ich sehr dankbar für Hilfe.
Am Ende würde ich gerne die Funktion im Anhang nutzen, um den String auf einem LCD Display auszugeben.
Dann wäre es wohl sinnvoll, die Zeile, auf die sich die Fehlermeldung "invalid initializer" bezieht genau anzusehen.
Der Funktionsprototyp passt übrigens auch nicht zu einem PSTR-String. Schau Dir mal die Deklaration einer bestehenden Funktion an, z.B. von strcpy_P().
Danke für die schnelle Antwort.
Ich werde versuchen, das Problem genauer zu beschreiben.
Die Funktion die ich angehängt habe, versuche ich mit einem im Flash gespeicherten String aufzurufen.
Während es mit lcd_writeProgString(PSTR("Test")) klappt, funktioniert es nicht, sobald ich einen bereits existierenden String übergeben zu versuche, also etwas wie
1
voidfunc(constchar*str){
2
3
lcd_writeProgrString(PSTR(str));
4
5
}
Die Zeilenangabe der Fehlermeldung bezieht sich genau auf die Zeile, in der lcd_writeProgString aufgerufen wird.
Danke für die schnelle Antwort.
Ich werde versuchen, das Problem genauer zu beschreiben.
Die Funktion die ich angehängt habe, versuche ich mit einem im Flash
gespeicherten String aufzurufen.
Das geht, aber nicht so.
Während es mit lcd_writeProgString(PSTR("Test")) klappt, funktioniert es
nicht, sobald ich einen bereits existierenden String übergeben zu
versuche, also etwas wie
Logisch. PSTR ist für Konstanten da.
Eher so. Du gibst ja nur den Zeiger auf den String im Flash an eine andere Funktion weiter.
ich versuche, einen einer Funktion als Parameter übergebenen String mit
dem Makro PSTR aus der <avr/pgmspace.h> im Flash eines AVR
Microcontrollers zu speichern.
Funktioniert nicht.
Welche Sprache?
C oder C++?
Wenn C++, dann kann man Funktionen überladen. Arduino verwendet die "incomplete Class" FlashStringHelper um zwischen Flash oder RAM Strings zu unterscheiden.
Hört sich teuer an, ist aber kostenlos zu haben, da das nur Pointer Konvertierungen sind, welche keine zusätzliche Rechenzeit/Code zur Laufzeit benötigen.
ich versuche, einen einer Funktion als Parameter übergebenen String mit
dem Makro PSTR aus der <avr/pgmspace.h> im Flash eines AVR
Microcontrollers zu speichern.
Der Makro PSTR wirkt bei der Übersetzung des Programms, nicht zur Laufzeit. Um zur Laufzeit einen String aus dem flüchtigen Speicher in den Flash zu programmieren müsstest du anders vorgehen. Das geht zwar, dauert aber recht lange, und macht bei häufiger Benutzung auch zügig den Flash kaputt. Das nur zu tun, weil eine Bibliotheksfunktion nur Flash-Strings akzeptiert, nicht aber solche im flüchtigen Speicher, macht wenig Sinn.
ich versuche, einen einer Funktion als Parameter übergebenen String mit
dem Makro PSTR aus der <avr/pgmspace.h> im Flash eines AVR
Microcontrollers zu speichern.
Wirklich? Aber egal.
Dann wirst du dich mit den Funktionen aus boot.h der avrlibc befassen müssen, und dazu ausführlich mit dem Datenblatt des Prozessors.
Gehen geht das, es erfordert aber ein grundlegendes Verständnis des Prozessors und der avrlibc, was du dir halt noch erarbeiten musst.
Gehen geht das, es erfordert aber ein grundlegendes Verständnis des
Prozessors und der avrlibc, was du dir halt noch erarbeiten musst.
Oder man schaut sich einfach an, wie bereits bestehende Funktionen implementiert sind. strcpy_P() bietet sich an, weil es mit beiden Arten des Speichers arbeitet - da kann man sich eigentlich alles abgucken.
Das ist irgendwie richtig, aber auch ungenau. Richtig wäre:
Keine Funktion außerhalb des Bootloaders schreibt ins Flash.
Edit: Achje, dass man das so lesen kann, dass der TO das Flash als EEPROM-Ersatz mißbrauchen will, sehe ich erst jetzt. Die Beispielfunktion sah so aus, als wolle er Daten aus dem Flash ans LCD schicken.