Crash durch printf (??) auf ATMEGA-2560

#3035891
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.
Angehängte Dateien:
#3036183
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...
Moderator Persönliche Seite #3036200
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.

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