Stackpointer von Hand initialisieren

Gast #74837
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
#74840
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
Gast #74841
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
Angehängte Dateien:
Gast #74843
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

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