Verwendung von Stringkostanten mit dem AVR?

Persönliche Seite #904430
Lesenswert?

Halloechen,

immer wieder stelle ich fest, dass der avrgcc offensichtlich 
String-Konstanten der Form
1
char* constant = "foobar";

nicht richtig verwendet. Konkret heisst das dass ich nu garble habe an 
dieser Speicherstelle.

Muss ich da irgendwas besonderes beachten, evt. einen Compiler-Switch 
usw...?


Michael
#904440
Lesenswert?

Michael G. wrote:

> immer wieder stelle ich fest, dass der avrgcc offensichtlich
> String-Konstanten der Form
>
1
char* constant = "foobar";
>
> nicht richtig verwendet.

Ich habe diesbezüglich noch keine Probleme feststellen können.

> Konkret heisst das dass ich nu garble habe an
> dieser Speicherstelle.

Dass an der Speicherstelle "constant" nicht der Text selber steht, 
sondern ein Pointer auf diesen, ist klar?
Persönliche Seite #904449
Lesenswert?

Stefan Ernst wrote:

> Dass an der Speicherstelle "constant" nicht der Text selber steht,
> sondern ein Pointer auf diesen, ist klar?

Stefan... ganz so daemlich bin ich dann auch nicht ;)

OK dann mal ein konkretes Beispiel:
1
  display_string("some string...");


Wobei display_string wie folgt definiert ist:
1
void display_string(char* string)
2
{
3
  while (*string != '\0')
4
  {
5
    display_send((uint8_t)*string++, TXT);
6
  }
7
}

Wenn ich Den String in der Art
1
  char buffer[3];
2
  ...
3
  buffer[0] = 'a';
4
  buffer[1] = 'b';
5
  buffer[2] = '\0';
6

7
  display_send(buffer);

verwende, funktioniert es wie erwartet.

Wo ist das Problem?
Gast #905228
Lesenswert?

Michael G. wrote:
> Ich hab das Problem gefunden!
> Die Sektion .data wurde von avr-objcopy nicht mit ins Hexfile
> uebernommen, daher waren die Strings undefiniert!
Die hat doch im Hexfile auch überhaupt nix zu suchen, oder? .data ist 
doch fürs RAM?!

Ich mein,
1
char *konstante = "abc";
ist schon saublöde: Das braucht vier Bytes im Flash (abc\0) und dann 
wirds beim Programmstart ins RAM kopiert und brauch da nochmal vier 
Bytes.
Such lieber mal nach PROGMEM.
#905237
Lesenswert?

Michael G. wrote:
> Ne Stefan, das waren in beidem Falle Pointer. Aber egal ich wusst doch
> dass das Problem nicht da liegen kann ;)
1
void display_string(char* string)
2
...
3
display_send((uint8_t)*string++, TXT);

Du denkst, dass du hier einen Pointer an display_send übergibst?
Persönliche Seite #905579
Lesenswert?

Stefan Ernst wrote:
> Michael G. wrote:
>> Ne Stefan, das waren in beidem Falle Pointer. Aber egal ich wusst doch
>> dass das Problem nicht da liegen kann ;)
>
>
1
> void display_string(char* string)
2
> ...
3
> display_send((uint8_t)*string++, TXT);
4
>
>
> Du denkst, dass du hier einen Pointer an display_send übergibst?

Warum sollte das so sein? display_send erwartet
1
display_send(uint8_t, uint8_t)
Um ihn mal von oben zu zitieren. Und ich vermute mal, dass es ein 
einzelnes Zeichen auf das Display schreibt. So würde nämlich auch diese 
while-Schleife Sinn machen, die da nämlich drumherum gebaut ist ;)

Mit "beide Fälle" meint er vermutlich lokale Variable vs. 
Stringkonstante.
#905592
Lesenswert?

Simon K. wrote:
> Stefan Ernst wrote:
>> Michael G. wrote:
>>
1
>> void display_string(char* string)
2
>> ...
3
>> display_send((uint8_t)*string++, TXT);
4
>>
>>
>> Du denkst, dass du hier einen Pointer an display_send übergibst?
>
> Warum sollte das so sein?

Er:
1
void display_string(char* string)
2
...
3
display_send((uint8_t)*string++, TXT);
1
char buffer[3];
2
...
3
display_send(buffer);

Ich:
> In den beiden Beispielen wird "display_send" komplett unterschiedlich
> verwendet. Wie ist denn das definiert?

Er:
> Achso ich hatte vergessen: display_send(uint8_t, uint8_t) hatte
> lediglich das zweite Argument vergessen im Beispiel.

Ich:
> Naja, nicht nur das. Im ersten Beispiel übergibst du ein einzelnes
> Zeichen, im Zweiten einen Pointer.

Er:
> Ne Stefan, das waren in beidem Falle Pointer.
Persönliche Seite #905751
Lesenswert?

Ihr seid schon lustig ;)

Ich hab mir auch mal die Sache mit Progmem reingezogen aber wegen ner 
einzigen Stringkostante sehe ich da keine Notwendigkeit zu. Sollte ich 
mal viele Konstanten speichern muessen werde ich mich daran erinnern.

Das Problem hat sich ja auch auf initalisierungen erstreckt durch die 
fehlende Sektion. Das sorgt dann schon fuer Frust wenn man's nicht 
weiss. Ich finde das ist sparen an der falschen Stelle.

Thx anyway :P
#905846
Lesenswert?

Michael G. wrote:
> Ihr seid schon lustig ;)

Nicht wirklich.
Du hast am Anfang einen Tippfehler gemacht und darauf wird
jetzt rumgeritten :-)

Was wieder mal zeigt, dass Code immer per Cut&Paste übernommen
und nicht neu eingetippt werden soll.

Aus einem deiner ersten Postings


> Wenn ich Den String in der Art
>  char buffer[3];
>  ...
>  buffer[0] = 'a';
>  buffer[1] = 'b';
>  buffer[2] = '\0';
>
>  display_send(buffer);

Hier muss es offensichtlich
1
  display_string( buffer );
lauten.

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