Einen Flash-String "ganz normal" verwenden

OP #491356
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:

1
#include <string.h>
2
#include <avr/pgmspace.h>
3

4
char swiftFlashStrBuf [21];
5

6
char* getSwiftFlashStr (PGM_P flashStr) __ATTR_CONST__;
7
char* getSwiftFlashStr (PGM_P flashStr)
8
{
9
   size_t len = strlen_P (flashStr);   
10
   
11
   if (len > sizeof (swiftFlashStrBuf) - 1)
12
   {
13
      len = sizeof (swiftFlashStrBuf) - 1; 
14
   }
15
   
16
   memcpy_P (swiftFlashStrBuf, flashStr, len);
17
   swiftFlashStrBuf [len] = 0;
18

19
   return swiftFlashStrBuf;
20
}
21

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

ich hoffe, dass das jemand gebrauchen kann.
Grüße Ralf
OP #491430
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
OP #491491
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

#491517
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren