mikrocontroller.net

Forum: Compiler & IDEs Speicherplatz einer Variable in c++ festlegen


Autor: Warhawk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich such eine möglichkeit beim ATMega32 eine Möglichkeit unter c++ 
selber festzulegen wo eine Variable im SRAM abgelegt werden soll oder 
eine Möglichkeit sich einpaar Byte im RAM zu reservieren wo der Compiler 
keine Variablen ablegt.
Ich benutze WinAVR 20060421.

Danke schonmal im Vorraus.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Grundsätzlich ist das möglich. Aber es ist heavy hacking stuff ;-)

Du kannst ein eigenes Linkercontrolscript anlegen und dort eine eigene 
section definieren z.B. vor oder nach der .data + .bss section. Die 
Linkercontrolscripte findest du bei winavr\avr\lib\ldscripts

Aber warum willst du das machen? Ich behaupte in den meisten Fällen, wo 
so eine Lösung in Betracht gezogen wird, gibt es auch andere Lösungen.

Autor: Warhawk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

das Problem was ich aktuell hab ist folgendes,
ich habe ein kleines Programm zur Kommunikation mit dem PC geschrieben 
(über die USART).
Das Programm funktioniert solange ich das Programm mit im Auto-Step 
Durchlaufen lass, aber sobald ich den Controller ganz "normal" (mit oder 
ohne JTAG) laufen lass macht der Controller nur noch schei***. Wenn ich 
das Programm nach dem ersten übertragungsfehler anhalte stehn in manchen 
Variablen Werte drin die eigentlich nicht entstehen dürften.
Ich hat jetzt die Vermuttung das vielleicht eine Byte im SRAM vielleicht 
was weg hat und wollte so mal nachprüfen es dran liegt, bzw. 
funktioniert wenn ich die Variable an eine andere Adresse verschieb.
Ich hab alle Interrupts gesperrt die ich nicht brauch und die die ich 
verwende sind auch nur dann frei geschalte wenn ich sie brauch.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du vermutest also ein defektes SRAM.

Dafür würde ich den Aufwand mit eigenem Speicherbereich nicht treiben.

Ich würde entweder den µC austauschen oder den Code auf 
Variablen-/Buffer-/Stackoverflows kontrollieren. Es gibt da verschiedene 
Verfahren vom Scharfdrüberkucken bis zum Begrenzen von 
Variablenabschnitten mit Magic-Variablen.

Bei der Kontrolle können wir im Forum helfen, wenn du den Quellcode 
angibst.

Autor: Warhawk (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mit den Magic-Variablen versuch ich dann gleich mal,
ich hab den quellcode jetzt noch schnell einwenig kommentiert und ne 
kleine Excel Tabelle geschrieben die das Protolkol erklärt.
Wenn jemand mal drüber schauen könnte währe das super.
Am SRAM liegts definitiv nicht, ich habs nochmal auf einem ATMega16 
getestet und da ist das gleiche.
Wie schon erwähnt läuft das Programm einwandfrei solang ich im Auto-Step 
durch geh oder auch per Hand schritt für schritt.
Sobald der µC einfach läuft ohne das der Debuger eingreift funktioniert 
fast nix mehr.
In der Execel Datei ist auch das beispiel was Aktuell übertragen werden 
soll.
Das Projekt ist aktuell auf eine ATMega16 mit 11.0592MHz und 9600 Baute 
eingestellt.

Vielen Dank schon mal für die viel Mühe

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe nix unmittelbar kritisches.

Ich würde eine Prüf- und Warnfunktion auf die Indexvariablen p_iRZaehler 
und p_iSZaehler einfügen. Es ist auch guter Programmierstil Variablen zu 
initialisieren. Soweit ich sehe, muss p_iRZaehler auf 1 initialisiert 
werden. Derzeit initialisiert der Startupcode automatisch auf 0, das 
kann bei "//Sende Datensätze" knallen.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also, ich habs mal durch vmlab gejagt. Das "stürzt" ab, weil du in

EvalRecData(void)
mit
UCSRB |= ((1<<TXCIE)|(1<<UDRIE));
den TXCIE freigibst, aber keine ISR dafür hast.

Ob das im richtigen Leben auch das Problem ist, wer weiss?

Oliver

Autor: Olaf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

> Wenn ich
> das Programm nach dem ersten übertragungsfehler anhalte stehn in manchen
> Variablen Werte drin die eigentlich nicht entstehen dürften.

Dann hat der Programmierer entweder einen Zeigerfehler programmiert, 
oder dir ist der Speicher ausgegangen.

Olaf

Autor: Warhawk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

das Problem war das der eine Interrupt freigeschaltet war und keine ISR 
definiert war.

Danke nochmal für die hilfe

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und ich träume immer noch von einem JTAG-Adapter, aber wenn der solche 
Fehler nicht findet, lohnt das viele dafür Geld ja wohl nicht.

Oliver

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Und ich träume immer noch von einem JTAG-Adapter, aber wenn der solche
>Fehler nicht findet, lohnt das viele dafür Geld ja wohl nicht.

War das Ironie?

Ein JTAG nimmt einem auch nicht das Denken ab. Bezüglich "viele Geld"
für den AVR kann mann sowas für 10 Euro nachbauen und inzwischen für 
50-60 Euro kaufen.

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.