Forum: Compiler & IDEs Watch von lokalen Variablen, die im RAM gehalten werden


von Jens Gerdes (Gast)


Lesenswert?

Hallo,

ich benutze:
- AVR Studio 4.08 Build 310
- WINAVR 20030913 (letzte Version)

Lokale Variablen, die nicht in Registern gehalten werden, sondern im
SRAM stehen, werden im Watch-Fenster des AVRStudio mit 'invalid
location' angezeigt, da die Adresse offenbar eine negative
Vorzeichenerweiterung bekommen hat (0xFFFFD6 anstatt 0x00D6).
Ich benutze den MFile Makefile Generator. Mache ich noch etwas falsch,
oder hat der EXTCOFF Konverter noch einen Fehler?

Gruss
Jens

von Jörg Wunsch (Gast)


Lesenswert?

Der extcoff-Konverter hat ganz sicher mehr als nur noch einen Fehler
;-), aber einen solchen sollte er nicht haben.  Du kannst Dir die
Debug-Infos des COFF-Files mit avr-objdump -g ansehen.  Wenn die
Adressen dort korrekt sind, dann würde ich den Fehler im AVR Studio
vermuten.

von Christian Specker (Gast)


Lesenswert?

Ich habe ein ähnliches problem bei mir, seltsamerweise scheint kein
Anderer dies bis dato bemerkt zu haben. Mein source sieht
folgendermassen aus:

int main(void)
{
    unsigned char ucTest;

    do
    {
        CalcIt(&ucTest);
        ShowIt(ucTest);
    }
    while (1);

    return(0);
}

Das Avr-Studio meldet für die Variable ucTest "Invalid location" mit
dem gleichen Verhalten, das J. Gerdes beschreibt. Die Variable wird
reell am Ende(!) des rams abgelegt; avr-objdump -g zeigt, das an dieser
Stelle der Stack liegen soll.
Alle Variablen, die Global deklariert werden belegen im Gegensatz
hierzu Ram Speicher der zu beginn des SRAM allokiert wird.
Das Makefile ist das Standard-Makefile der demos, die dem WinAVR
beiliegen, Controller ist der 90s2313. Ich benutze das AVR-Studio
Version 4.07 und 4.08.

Schade ist, daß sich das jetzt nur noch über das Memwatch-Fenster
debuggen lässt, in größeren Anwendungen wird das jedoch nicht möglich
sein.

@Jörg: IMHO ist das AVR-Studio schuld - wenn kann ich bei Atmel
anschreiben (PM ?).

@µC.net: Gibt es Lösungen/Ansätze ?

Gruß,
Christian

von OldBug (Gast)


Lesenswert?

Lokale Variablen werden doch, meiner Meinung nach, immer auf dem Stack
angelegt, oder irre ich da?

Gruß,
Patrick...

von Jörg Wunsch (Gast)


Lesenswert?

Nein, Du irrst hier nicht.  Die Variable liegt auf dem Stack und damit
,,am Ende des RAMs, dort, wo eigentlich der Stack liegen sollte''.
;-)

Die Offsets zum Stackframe sind im COFF-File wohl richtig eingetragen,
allerdings vermute ich mal, daß an dieser Stelle die verschiedenen
ABIs, die die einzelnen Compiler benutzen, einfach mal dazu führen,
daß AVR Studio mit den Stack Frames, die GCC produziert, nicht
klarkommt.  Es wäre in der Tat einen Report an Atmel wert.  Die via
GCC und avr-objcopy erzeugten COFF-Files tragen eine eindeutige
Markierung, so daß AVR Studio sich darauf einstellen könnte, die GCC
Frames zu dekodieren.

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.