mikrocontroller.net

Forum: Compiler & IDEs RAM-Zugriffsfehler auf Adr. 0x500


Autor: Markus Altmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ich arbeite mit einem ATmega162, avr-gcc 3.3.1, binutils 2.14 (avr-ld
2.14 20030612)

Ich habe folgendes Problem:
Beim Aufruf einer Funktion wird der Pointer auf eine lokale Variable
übergeben um der Funktion zu ermöglichen dorthin zu schreiben.

Dieser Pointer zeigt allerdings ausserhalb des gültigen RAM Bereiches
der bei 0x4FF endet
Er zeigt auf 0x500!


Ich habe einen Auszug der Ausgabe von nm beigefügt wo ich aber keinen
Fehler erkennen kann.
Die relevanten Codeteile sind auch dabei.

Ich verwende das Standard Linker Script und verwende auch sonst keine
besonderen Compiler-Parameter
CFLAGS   = -g -Wall -O -mmcu=atmega162 -I/usr/avr/include
LDFLAGS  = -Wl,-t,-Map,main.map

Ich habe diese Routine auch schon simuliert, allerdings kompiliert für
den mega16 da der mega162 von simulavr nicht unterstützt wird, die
Routine funktioniert, es dürfte sich eher um ein
Implementierungsproblem handeln.


Hat jemand eine Idee?

PS Arbeitet eingentlich sonst auch jemand mit dem mega162, hab im Forum
noch selten was drüber gefunden?

Danke für die Hilfe
Markus

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Würde nach Bug klingen, kann ich aber nicht reproduzieren.

Das generierte .s sieht bei mir so aus:

        ldi r28,lo8(__stack - 6)
        ldi r29,hi8(__stack - 6)
        out _SP_H_,r29
        out _SP_L_,r28
        movw r16,r28
        subi r16,lo8(-(1))
        sbci r17,hi8(-(1))
        push r17
        push r16
        ldi r24,lo8(.LC1)
        ldi r25,hi8(.LC1)
        push r25
        push r24
        call printf
        movw r24,r16
        call getRTC

d. h. rr16..17 führen die Adresse Deiner lokalen Variablen, und die
werden auf __stack - 6 + 1 initialisiert.

Autor: Markus Altmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,
Ich habe meine main() mit dem Attribut naked versehen um Platz zu
sparen, da ich der Meinung war, dass diese Funktion nicht umbedingt
einen Pro- bzw. Epilog braucht, damit bin ich aber anscheinend falsch
gelegen.

Sobald ich dieses Attribut weglasse funktioniert es.

Kannst du mir da den Grund nennen?

Eine andere Frage wie bekomme ich die .s files wie du sie geposted
hast?
Ich habe bis jetzt immer nur im list file nachgeschaut um zu sehen was
der Compiler produziert, wo z.B ein call nur mit der Sprungadresse
sichtbar ist und nicht mit dem dazugehörigen Funktionsnamen.

Gruß Markus

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich habe meine main() mit dem Attribut naked versehen um Platz zu
> sparen, [...]

Pilot error. ;-)

Wie Du siehst, brauchst Du den Prolog/Epilog (zur Erzeugung der
auto-Variablen), sonst würde ihn der Compiler sowieso weglassen.

Solche Details solltest Du natürlich mit posten...

> Eine andere Frage wie bekomme ich die .s files wie du sie geposted
> hast?

Compileroption -S statt -c (ggf. auch das -g weglassen).  Bei
passendem Makefile genügt es, `make foo.s' zu schreiben.  (Wichtig:
kleines .s, ein großes .S ist was anderes.)

Warum die Leute alle so auf diese Disassembler-Listings stehen, kann
ich Dir auch nicht sagen.  Ich mag den direkt produzierten
Assemblercode lieber -- auch wenn er nicht den C-Code enthält, der
wird im combined listing nachträglich anhand der Debuginfo wieder
eingefügt.  Wenn man das -g dringelassen hatte, kann man anhand der
.stabn-Anweisungen die Zeilennummern verfolgen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.