Forum: Compiler & IDEs AVR GCC Textausgabe von Flash-Strings


von Karl A. (charly_a)


Lesenswert?

Ich hab da ein kleines Verständnisproblem, evtl. kann mir da jemand 
weiter helfen:

Es gibt eine Funktion text_p(), die gibt einen String aus dem Flash auf 
einem Display aus, das funktioniert und frisst auch kein RAM.

Wenn ich aber text_p() in einer Funktion aufrufe, die den Pointer auf 
den Text als Parameter übergibt, kommt nur nonsens raus.
Wo ist mein Denkfehler?
da wird doch nur eine Adresse, die ins Flash zeigt, weitergereicht
und wie kann man das lösen?

eine Version ohne _p also mit strings aus dem RAM, funktioniert. Aber 
ich habe da ca. 2kB Texte und nur 4kB RAM.
Umgebung: AtmelStudio7, GCC V5.4.0, AT90CAN128

hier das codeschnipsel:
1
 void text_p(int x, int y, int attr,const char *str)
2
{
3
  EAK_set_cursor(x,y);
4
  EAK_set_attr(attr);
5
  while(pgm_read_byte(str) != 0x00){
6
    EAK_putc(pgm_read_byte(str++));
7
  }
8
}
9
10
11
text_p(3,5,COLOR_STD,"my text");
12
-> das funktioniert
13
14
----------------------------------------------------- 
15
void initpage_p(const char *headline)
16
{
17
  clear_screen();
18
  ...
19
  if(LogoTxt!=NULL){
20
    text_p(0,0,COLOR_STD,headline);
21
  }
22
  ...
23
}
24
25
initpage_p("**headline**");
26
27
-> in der kopfzeile steht dann nur Mist???

von Rolf M. (rmagnus)


Lesenswert?

Karl A. schrieb:
> text_p(3,5,COLOR_STD,"my text");
> -> das funktioniert

Das erstaunt mich, denn "my text" ist ja kein Flash-String.

Karl A. schrieb:
> -> in der kopfzeile steht dann nur Mist???

Das dagegen würde ich erwarten, da du einen Zeiger auf einen RAM-String 
übergibst und dann aber dessen Adresse verwendet wird, um aus dem Flash 
zu lesen.

von Karl A. (charly_a)


Lesenswert?

du hast vollkommen Recht, das muss natürlich PSTR("text") heißen.
hab den Code einfach schnell hingetippt.
Aber das war auch der Fehler im Programm:
bei den initpage_p Aufrufen war auch kein PSTR davor.
text_p wird ansonsten über ein Macro aufgerufen
1
#define TEXT_P(x,y,attr,string) (text_p(x,y,attr,PSTR(string)))

jetzt funktionierts!
Danke!

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.