Forum: Compiler & IDEs Crash durch printf (??) auf ATMEGA-2560


von Hanns-Jürgen M. (yogy)


Angehängte Dateien:

Lesenswert?

Ich habe ein ähnliches Problem mit dem printf-Befehl, das bereits in 
einem anderen, früheren Thread angesprochen wurde.

Bei meinem vorherigen Projekt auf einem ArduinoMega 1280 Board lief 
alles einwandfrei, aber jetzt bin ich auf eines mit dem AVRMEGA 2560 
umgestiegen und der einzig verbliebene printf-Befehl bringt die SW zum 
Absturz. Nach Tante Google liegt wohl eine falsche 
Rücksprung/Einsprungadresse vor.

Im Makefile habe ich den Prozessor auf den 2560 eingestellt, dennoch 
bringt das Log im Atmel-Studio 6.0 die Meldung: Device: atmega1280. Ist 
das die Ursache? Bzw. wo kann das/wie eingestellt werden?

Zu meinem Vorgehen: Ich habe die alten Projektfiles des 1280 in einen 
neue Directory umkopiert, die Namen entsprechend geändert und die alte 
SW gekürzt (nicht benötigte Routinen und includes rausgeschmissen)

Als Compiler wird WIN-AVR von 2010-01-10 verwendet.

Ich stehe ziemlich auf dem Schlauch bzw. habe aktuell noch ein Brett vor 
dem Kopf...

Hat einer einen Tipp oder einen Link. wäre supertoll.

Makefile habe ich mal angehängt.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

in deinem angehangenen Makefile steht:

MCU = atmega1280

Das solltest du vielleicht ändern...

Grüße Uwe

von Hanns-Jürgen M. (yogy)


Lesenswert?

Ommmmgh... was bin ich blöde, doppelt blöde. Danke, Uwe.

Das Makefile, daß ich gklaubte zu benutzen, steckte in der 
Projekt-Direktory. Dieses makefile hat auch den richtigen Prozessor...

Hingegen ist das verwendete Makefile, und damit auch das, was ich 
hochgeladen hatten, das "alte" mit dem 1280-Porzessor, und dieses File 
steht in der Directory ../debug...

Was bin ich blöde. Diese Woche ist/war ohnehin nicht "meine"...

Mit dem 256er Makefile ist alles okay, es printf't ganz toll.

Viele Grüße vom blöden Yogy...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hanns-Jürgen "Yogy" Mostert schrieb:
> Mit dem 256er Makefile ist alles okay, es printf't ganz toll.

Kurz gesagt: es geht mit dem anderen vor allem deshalb nicht,
weil AVRs mit mehr als 128 KiB Flash beim CALL drei Bytes auf
den Stack schieben für die Rücksprungadresse statt nur zwei
Bytes bei den kleineren.  Normalerweise fällt das nicht sehr
auf, aber printf() ist eine sogenannte variadische Funktion,
bei der man die Argumente hinter dem Formatstring nicht mehr in
Registern übergeben kann, sondern diese auf dem Stack übergibt.
An dieser Stelle ist es aber wichtig, wie viel Platz die
Rücksprungadresse einnimmt.

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.