Hallo da draußen, um RAM zu sparen versuche ich, meine Texte für den USART-Debugger ins FLASH zu verlegen, dazu ein Beispiel: static uint8_t x [ ] PROGMEM = "anzahl_nicht_beschriebener_stellen" ; printf (" %c \n\r", x ) ; // das ist Zeile 269 !! ...und der gcc meldet: ../wert_eingabe_vid_prgr_nr.c: In function `vid_prgr_nr_edit_wert': ../wert_eingabe_vid_prgr_nr.c:269: Warnung: int Format, Zeiger Argument (Argument 2) Bin Anfänger und verstehe die Fehlermeldung nicht und weiß auch nicht , was ich falsch mache, denn x ist ein Array, aber doch auch ein pointer auf das Array. Wie geht's richtig ?? ...noch schöne, dicke Ostereier von Otto
probier mal printf (" %s \n\r", PSTR(x)); Du willst einen String ausgeben, deshalb %s, sowie einen Pointer der aber im Flash liegt, dieser muss erst mittels PSTR "konvertiert" werden. Da der AVR Flash und Ram getrennt hat, braucht man versch. Zugriffsstrategien. Weiteres stet im GCC-Tutorial. Gruß Roland
Hier mal ein Beispiel (könnte man der Einfachheit hablber auch ohne Malloc machen): #include <avr/eeprom.h> char eeStartupMsg[] EEMEM = "VERSION 0.0.5 ALPHA\r\n"; int main() {mc_init(); char *startupMsg = malloc(sizeof(eeStartupMsg)); eeprom_read_block(startupMsg,&eeStartupMsg,sizeof(eeStartupMsg)); printf("%s",startupMsg); free(startupMsg); } Achte auch darauf, dass du die .eep-Datei mitflasht. MfG, Nico
Falls der Formatstring in PROGMEM stehen soll printf_P(PSTR("Hallo aus dem Progmem %d mal.\n"), 73); Falls ein String-Parameter im PROGMEM steht printf(" %S %d %S\n", PSTR("Hallo aus dem Progmem\n"), 73, PSTR("mal")); Beachte "%S" statt "%s" im Format!!!
Hallo Roland, danke für Deine schnelle Antwort. Das %s war mir völlig neu, ist aber logisch. Was PSTR macht, habe ich noch nicht gerafft, ich denke es regelt, welcher Speichertyp angesprochen werden soll, aber 'mal im Blindflug hingeschrieben ergibt das eine neue Fehlermeldung des gcc: ../wert_eingabe_vid_prgr_nr.c: In function `vid_prgr_nr_edit_wert': ../wert_eingabe_vid_prgr_nr.c:269: Fehler: ungültige Initialisierung ../wert_eingabe_vid_prgr_nr.c:269: Fehler: __c löst einen Abschnittstypkonflikt aus make: *** [wert_eingabe_vid_prgr_nr.o] Error 1 Build succeeded with 0 Warnings... No 'ne Idee ? Schönes Oster-WE noch ! Otto
Sorry, aber mit "deutschen" Fehlermeldungen stehe ich seit mehr als 20 Jahren auf Kriegsfuß. Wenn man sie mit dem Wörterbuch ins Englische zurückübersetzt ergeben sie oft eine Sinn, aber so ;-( Ich verute aber mal das mit eine PSTR() etwas nicht stimmt, da das Makro etwas mit einem __c anstellt. <cut source="avr/pgmspace.h"> # define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];})) </cut>
Bitte poste einen Sourcecode, mit dem der Fehler reproduzierbar ist. Ich habe Werners Beispiele ausprobiert und bekommen keine Fehler. PSTR() ist aber zuweilen wirklich etwas eigenwillig in der Anwendung, da es auf einem GCC-Trick beruht (ein Block darf einen Wert zurückgeben).
Hallo Jörg, mein Programm ist nicht besonders kompliziert, steuert ein LCD, fragt 10 Tasten ab, steuert einen MPEG2-Encoder-chip und die ganze Video-Audio-Pripherie, aber es gibt einige 100 verschiedene Betriebszustände mit entsprechenden LCD-Texten und Tasten-Freigaben etc. Die Programm-Struktur habe ich mir selbst überlegt, sie funktioniert, ist aber u.U. nicht das, was ein erfahrener Programmiere machen würde. Das Programm hat mehr als 20 c-files und mehr als 10.000 Zeilen, ist aber sehr gut dokumentiert. Würde Dich so ein Source-Code interessieren ? Otto
Otto Wenn die Anforderung nach einem Beispiel kommt, dann ist damit gemeint: Ein mögtlichst kurzes aber vollständiges Programm. Das kann auch bedeuten, dass DU dieses Programm extra als Testprogram schnell schreibst. Was machen wir damit: Cursor drauf. Copy&Paste in unsere eigene Entwicklungsumgebung Compiler drueber und nachschauen was passiert, was nicht passiert bzw. wo der Fehler ligen könnte. Du willst Hilfe, also musst Du auch etwas dafür tun.
Vielen Dank an Alle, ich hab' die verschiedenen Ansätze zwar in der Tiefe noch nicht ganz verstanden, aber es läuft, wie es soll, nochmals Danke Otto
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.