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


von Ralf R. (voltax)


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

von Ralf R. (voltax)


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

von Oliver (Gast)


Lesenswert?

http://www.nongnu.org/avr-libc/user-manual/group__avr__pgmspace.html#g9c3ff50bdf59b38219394ff5230660da

Ich habs noch nicht probiert, aber was spricht gegen:

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

Oliver

von Ralf R. (voltax)


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


von Karl H. (kbuchegg)


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.

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
Noch kein Account? Hier anmelden.