Forum: Compiler & IDEs stringkonstanten aus dem rom lesen


von Paul H. (powl)


Lesenswert?

Hi!

Wenn ich sowas wie

uart_puts("Ich bin eine Stringkonstante im RAM!");

schreibe, dann lagert er diesen String ja im Ram aus. Wenn ich den gerne 
im Rom hätte müsste ich dort extra über

char PROGMEM s[] = "Ich bin eine Stringkonstante im ROM!";
uart_puts(&s); // Funktion die über pgm_read_byte() die variable aus dem 
ROM holt.

Geht das auch komfortabler so dass ich sowas wie uart_puts(PROGMEM 
"balbla") schreiben kann? oder so ähnlich, oder ganz automatisch.

lg PoWl

von Stefan E. (sternst)


Lesenswert?

Was du suchst, ist dieses:
1
uart_puts(PSTR("blabla"));

Aber weder diese Kurzform, noch deine lange Version, werden 
funktionieren, wenn uart_puts einen "normalen" String erwartet (also 
einen, der im RAM steht).

von Paul H. (powl)


Lesenswert?

ah, dankeschön das kannte ich noch garnicht.

welchen variablentyp muss eine funktion denn dann erwarten?

uart_puts_pgm(const uint16_t *string); ?

von Werner B. (werner-b)


Lesenswert?


von Stefan E. (sternst)


Lesenswert?

Paul Hamacher wrote:

> welchen variablentyp muss eine funktion denn dann erwarten?
>
> uart_puts_pgm(const uint16_t *string); ?

Nein, das ist keine Frage des Variablentyps. Die Funktion muss den 
String aus dem Flash lesen, also speziell für Flash-Strings programmiert 
worden sein.

von Paul H. (powl)


Lesenswert?

ich weiß, die funktion muss ich mir schon selbst schreiben, wollte nur 
wissen was die funktion dann als argument erwartet ;-)
1
void uart_puts_pgm(char *string)
2
{
3
  char temp;
4
5
  while(1)
6
  {
7
    temp = pgm_read_byte(string);
8
9
    if(temp)
10
    {
11
      uart_putc(temp);
12
      string++;
13
    }
14
    else
15
    {
16
      break;
17
    }
18
  }
19
}

habs jetzt so, funktioniert prima. Danke!

lg PoWl

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.