Forum: Compiler & IDEs Stackpointer von Hand initialisieren


von Philipp B (Gast)


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

von Peter D. (peda)


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

von Philipp B (Gast)


Lesenswert?

ja klar, hab ich

von Peter D. (peda)


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

von Philipp B (Gast)


Angehängte Dateien:

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

von Peter D. (peda)


Angehängte Dateien:

Lesenswert?

Damit compiliere ich.


Peter

von Philipp B (Gast)


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

von Peter D. (peda)


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

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Was hat das damit zu tun?

von Peter Fleury (Gast)


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/install_config_WinAVR.pdf

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.