Crash durch printf (??) auf ATMEGA-2560

OP #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:
OP #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

Eine eigene Frage? Dieser Thread ist über 13 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.