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.
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?
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. :-)
Wenn der Stack mit dem IAR ausreicht, mit GCC aber nicht, fehler vielleicht nur die richtigen Optimierungseinstellungen?
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)
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.
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. ...
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; }
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++)); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.