Forum: Compiler & IDEs AVR Studio 5 Stackgröße einstellen


von Michael (Gast)


Lesenswert?

Hallo,

ich habe vom freien 4kb IAR Compiler auf das AVR Studio 5 mit dem 
AVR-GCC gewechselt. Habe da allerdings Probleme mit dem Stack. Ich 
steuere ein Display mit einer eigenen putchar Routine an und die 
Stackgröße reicht nicht aus. Jetzt weiß ich allerdings nicht wo ich die 
Stackgröße einstellen kann.
Kann mir da evtl. jemand helfen. Ich benutze kein Makefile sonder die 
Projekteinstellen vom Studio.

von Stefan E. (sternst)


Lesenswert?

Michael schrieb:
> Jetzt weiß ich allerdings nicht wo ich die
> Stackgröße einstellen kann.

Man kann die Stackgröße nicht einstellen. Die Anordnung der Daten im RAM 
ist so gewählt, dass der Stack immer automatisch die maximal mögliche 
Größe hat. Wenn dir der Stack also überläuft, dann braucht dein Programm 
insgesamt zu viel RAM. Wie merkst du denn überhaupt, dass der Stack zu 
klein ist?

von Floh (Gast)


Lesenswert?

Michael schrieb:
> ich habe vom freien 4kb IAR Compiler auf das AVR Studio 5 mit dem
> AVR-GCC gewechselt.

Beim IAR gibts 2 Stacks, beim AVR-Gcc nur einen.
Daher kann man beim AVR-Gcc nix einstellen.
:-)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Wenn der Stack mit dem IAR ausreicht, mit GCC aber nicht, fehler 
vielleicht nur die richtigen Optimierungseinstellungen?

von Michael (Gast)


Lesenswert?

Ich merke es dadurch, dass meine putchar Funktion den richtigen 
Buchstaben übergeben bekommt, auf dem Display aber nur kryptische 
Zeichen dargestellt werden. Der Zeichensatz für das Display liegt im 
Flashspeicher. Früher hatte ich bei dem IAR Compiler immer ähnliche 
Probleme. Das lies sich immer mit der Größe des Stacks beheben. Sram für 
eigene Variablen benutze ich eigentlich kaum(20 Byte)

von Stefan E. (sternst)


Lesenswert?

Michael schrieb:
> Der Zeichensatz für das Display liegt im
> Flashspeicher.

Sicher? Du hast das korrekt von IAR nach avr-gcc portiert? Keine Ahnung 
wie es beim IAR ist, aber beim avr-gcc reicht ein einfaches "const" z.B. 
nicht dafür aus.

von Michael (Gast)


Lesenswert?

Der Zeichensatz wurde so abgelegt:

unsigned char PROGMEM Font6x8[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // "(space)"
  0x00, 0x00, 0x06, 0x5F, 0x06, 0x00, // "!"
  0x00, 0x07, 0x03, 0x00, 0x07, 0x03, // """
  0x00, 0x24, 0x7E, 0x24, 0x7E, 0x24, // "#"
  0x00, 0x24, 0x2B, 0x6A, 0x12, 0x00, // "$"
        usw. ...

von Stefan E. (sternst)


Lesenswert?

Michael schrieb:
> Der Zeichensatz wurde so abgelegt:

Ok. Und wie sieht der Zugriff darauf aus?

von Michael (Gast)


Lesenswert?

Hallo,

beim Aufruf wird auf das richtige Zeichen übergeben, also ch ist 
richtig.
Kann es sein das bei "unsigned char *fontptr" noch etwas hinzugefügt 
werden muss?

int lcd_putchar(char ch, FILE *stream)
{

  unsigned char *fontptr;
  unsigned char x;

  fontptr = Font6x8;

  if((ch >= 32) && (ch < 126))
  {
    fontptr = fontptr+6*(ch-32);

    for(x = 0; x < 6; x++)
    {
     SendData(*fontptr++);
    }
  }
  return ch;
}

von Stefan E. (sternst)


Lesenswert?

Du kannst auf die Daten im Flash nicht direkt (transparent) zugreifen. 
Du musst sie über die entsprechenden Funktionen auslesen.
1
     SendData(*fontptr++);
->
1
     SendData(pgm_read_byte(fontptr++));

von Michael (Gast)


Lesenswert?

Super, danke, so funktioniert es. Der Umstieg ist doch etwas schwieriger 
als gedacht, aber ich werde mich schon eingewöhnen.

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.