mikrocontroller.net

Forum: Compiler & IDEs Stackpointer von Hand initialisieren


Autor: Philipp B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
nach langem ausprobieren und simulieren bin ich nun dahintergestiegen,
dass der Stackpointer nicht richtig initialisiert wird.
(WinAVR mit ATmega8)

Zum Problem:
Bisher konnte ich keine Funktionen in C verwenden, sie simulation
klappte ohne Probleme, nur der Mikocontroller wollte nicht.
Nun ich bin dahinter gestiegen, dass WinAVR den SP (Stackpointer) zwar
initialisert, aber vollkommen falsch:
LDI     R28,0x00
LDI     R29,0x00
OUT     0x3E,R29
OUT     0x3D,R28

Also auf Adresse 0x00. Resultat war, dass meine Programme nicht mehr
vom unterprogramm/funktion wieder zurückspringen konnten.

Nun, ich hab das Problem jetzt gelöst, in dem ich den SP von Hand
initialisiere:
....
void main() {
      SP=RAMEND;
....

daraus wird dann ca. sowas:
LDI     R28,0x00
LDI     R29,0x00
OUT     0x3E,R29
OUT     0x3D,R28  ' Erstmal falsch initialisieren
LDI     R24,0x5F
LDI     R25,0x04
OUT     0x3E,R25
OUT     0x3D,R24  ' Dann richtig von Hand


Zu meiner Frage:
Ist das bei euch auch so?? und wieso wird der SP erst falsch
initialisiert?
Danke für Tipps

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir stimmts:

int main( void )
{
 136:   cf e5           ldi     r28, 0x5F       ; 95
 138:   d4 e0           ldi     r29, 0x04       ; 4
 13a:   de bf           out     0x3e, r29       ; 62
 13c:   cd bf           out     0x3d, r28       ; 61


Hast Du dem Compiler den Typ richtig angegeben:

avr-gcc.exe -mmcu=atmega8


Peter

Autor: Philipp B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja klar, hab ich

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Außerdem ist SP=RAMEND; schlichtweg falsch !

Wie es aussieht, werden Variablen im main() hinter dem Stack abgelegt,
d.h. diese Variablen würden dann munter übergePUSHt, wie z.B. in
nachfolgendem Listung mit "char s[30];" zu sehen ist.

int main( void )
{
  80:   c1 e4           ldi     r28, 0x41       ; 65
  82:   d4 e0           ldi     r29, 0x04       ; 4
  84:   de bf           out     0x3e, r29       ; 62
  86:   cd bf           out     0x3d, r28       ; 61
  char s[30];


Vielleicht solltest Du mal Dein "MAKE" anhängen, damit einer der
Experten da einen Fehler entdecken kann. Ich benutze kein MAKE.
Ich könnte Dir höchstens meine "AC.BAT" geben, die alle C-Files im
aktuellen Verzeichnis compiliert und zusammenlinkt.


Zuerst solltest Du Dein Programm aber weitmöglichst minimieren, ob der
Fehler bleibt. Eventuell kann dann der letzte Minimierungsschritt,
bevor der Fehler verschwand, mehr Aufschluß geben.


Peter

Autor: Philipp B (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Also hier ist schonmal mein Makefile.

Mein Programm hab ich schon soweit wie möglich minimiert um das Problem
zu finden.
Wäre echt super wenn ich deine Bat Datei bekommen könnte, dann kann ich
mal schauen, ob es dann klappt

Autor: Peter Dannegger (peda)
Datum:
Angehängte Dateien:
  • Ac.bat (460 Bytes, 219 Downloads)

Bewertung
0 lesenswert
nicht lesenswert
Damit compiliere ich.


Peter

Autor: Philipp B (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm, mit deiner Datei geht es. Aber dadurch wird mein Programm von 21
Befehlen auf 77 Befehle aufgestockt.
Die ersten 20 bestehen nur aus irgendwelchen Sprüngen.

Aber jetzt hab ich meinen Fehler gefunden. Es liegt wirklich an meiner
Makefile. Und zwar wird bei mir nicht gelinkt. Weil dort die Angaben
"-c" mit übergeben wird.

Mal schauen ob ich irgendwo ein lauffähiges Makefile bekomme

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der GCC hat eine Großschriftallergie. Der Code ist zwar funktional
richtig, aber manchmal etwas größer, wenn der Name des Sourcefile mit
".C" statt ".c" endet. Hier steht näheres dazu.

http://www.mikrocontroller.net/forum/read-2-44224.html


Peter

Autor: Andreas Schwarz (andreas) (Admin) Benutzerseite Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was hat das damit zu tun?

Autor: Peter Fleury (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Philipp B
Ein lauffähiges Makefile findest Du im \Winavr\sample Verzeichnis.
Kopiere es in dein Projekt-Verzeichnis und passe es für dein Projekt an
gemäss den Kommentaren im Makefile oder nach folgender Anleitung:

http://www.avrfreaks.net/Tools/ToolFiles/376/insta...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.