mikrocontroller.net

Forum: Projekte & Code Einen Flash-String "ganz normal" verwenden


Autor: Ralf Rosenkranz (voltax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich möchte hier mal einen Codeschnipsel posten, der vielleicht ganz 
hilfreich sein könnte (oder aber evtl. auch völlig trivial ist).

Jedenfalls brauchte ich eine Routine, die Strings aus dem Flash für 
"Einmalnutzung" so herausliest, dass man sie wie ganz normale Strings 
verwenden kann. In meinen Fall brauchte ich das, um diese Strings einer 
bereits vorhandenen Print-Routine zu übergeben.

Die mit getSwiftFlashStr gelesenen Strings können so lang sein wie 
swiftFlashStrBuf Platz bietet, und sind so lange gültig, bis man den 
nächsten String liest:

#include <string.h>
#include <avr/pgmspace.h>

char swiftFlashStrBuf [21];

char* getSwiftFlashStr (PGM_P flashStr) __ATTR_CONST__;
char* getSwiftFlashStr (PGM_P flashStr)
{
   size_t len = strlen_P (flashStr);   
   
   if (len > sizeof (swiftFlashStrBuf) - 1)
   {
      len = sizeof (swiftFlashStrBuf) - 1; 
   }
   
   memcpy_P (swiftFlashStrBuf, flashStr, len);
   swiftFlashStrBuf [len] = 0;

   return swiftFlashStrBuf;
}

extern void consolePrintln (char* s);
consolePrintln (getSwiftFlashStr (PSTR ("Hallo Welt")));

ich hoffe, dass das jemand gebrauchen kann.
Grüße Ralf

Autor: Ralf Rosenkranz (voltax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo nochmal,

jetzt wo der Code hier so mager rumsteht, macht er wirklich einen sehr 
simplen Eindruck, und man sieht gar nicht, dass ich stundenlang daran 
herumexperimentiert habe, bis der Compiler ihn endlich ohne zu meckern 
compilieren wollte.

btw: was macht "__ATTR_CONST__" eigentlich genau, ohne das sich das 
Ergebnis von PSTR nicht an getSwiftFlashStr übergeben lassen wollte. 
Ausgeschrieben kommt wohl "__attribute__((_const_)) dabei heraus, 
macht die Sache aber auch nicht klarar. Und weswegen kann ich es nur in 
einer Prototyp-Deklaration verwenden? (deshalb die doppelte Zeile):

char* getSwiftFlashStr (PGM_P flashStr) _ATTR_CONST_;
char* getSwiftFlashStr (PGM_P flashStr)

Grüße Ralf

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.nongnu.org/avr-libc/user-manual/group__...

Ich habs noch nicht probiert, aber was spricht gegen:

char swiftFlashStrBuf [21];
consolePrintln (strcpy_P(swiftFlashStrBuf ,PSTR ("Hallo Welt")));

Oliver

Autor: Ralf Rosenkranz (voltax)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Oliver,

> char swiftFlashStrBuf [21];
> consolePrintln (strcpy_P(swiftFlashStrBuf ,PSTR ("Hallo Welt")));

stimmt, so gehts auch. Wenn man erstmal weiss, wie das mit den 
Flash-Strings geht, ist es ganz leicht. Nur nach einem Beispiel wie 
Deinem habe ich vorher lange im Web gesucht, und nix passendes gefunden. 
Nur reichlich Code wie man zB. Flash-Strings ans LCD oder die UART 
sendet, ohne dabei in einen Zwischenspeicher zu kopieren. Na jetzt 
stehts ja hier, und erspart anderen vielleicht die Suche.

Grüße Ralf


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Nur reichlich Code wie man zB. Flash-Strings ans LCD oder die UART
> sendet, ohne dabei in einen Zwischenspeicher zu kopieren

Und das hat auch seinen guten Grund. Den fehlenden Zwischenspeicher
meine ich.

> Na jetzt stehts ja hier

Nette Idee, diese Funktion. Ist aber genauso gefährlich
wie strdup(). Eher sogar noch mehr, da dein Zwischenspeicher
in der Länge limitiert ist.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.