Forum: Mikrocontroller und Digitale Elektronik Schleifenvariablen im AVR Simulator werden nicht gezählt


von Andreas S. (schunki)


Lesenswert?

Hallo zusammen!

Ich versuche gerade einen Code im Simulator des AVR Studio 6.1 laufen zu 
lassen. Dabei ist mir aufgefallen, dass meine Schleifenvariablen immer 
mit dem Wert 0 angezeigt werden. Auch nach einem oder zwei Durchläufen 
hab ich hier immer noch die Null stehen. Trotzdem springt der Simulator 
aber nach der benötigten Anzahl der Schleifendurchläufe aus der Schleife 
raus!

Ich habe bereits die Optimierungseinstellungen des Compilers ganz 
ausgeschlatet. Aber die Schleifenvariablen sind und bleiben bei Null! 
Weiß zufällig jemand hier woran es liegen könnte?


Gruß
Andreas

von Code (Gast)


Lesenswert?

Wo ist der Code?

von trollalarm (Gast)


Lesenswert?

Ich habe eine Hose.
Meine Freundin findet sie schön.
Was meinst DU?

von Andreas S. (schunki)


Lesenswert?

Ihr Schlaumeier!

Es hat nichts mit dem Code zu tun! Sondern wird an irgendwelchen 
Einstellungen liegen

Aber bitte...... hier ist die For-Schleife um die es geht:
1
int i;
2
int spalte;
3
int zeile;
4
Matrix_3x3 invMatrix;
5
double HM[5][5];
6
  
7
//Erstellen einer 5x5 Hilfsmatrix
8
for(zeile=0; zeile<3; zeile++){
9
  for(spalte=0; spalte<3; spalte++){
10
    HM[spalte][zeile]=M1.data[spalte][zeile];
11
  }
12
}
13
.
14
.
15
.

Matrix_3x3 ist eine struct-Variable die per typdef definiert ist und hat 
in data ein 3x3 Aray.

von Εrnst B. (ernst)


Lesenswert?

Grad bei so kurzen Schleifen kann sich der Compiler überlegen, einfach 
die neun Zuweisungen hintereinander zu schreiben (loop unrolling).

Compilier mit -O0 um dir das anzuschauen...

von Andreas S. (schunki)


Lesenswert?

Ich hab doch schon in meinem Post geschrieben, dass ich die Optimierung 
ganz ausgeschaltet hab! Ich hab also schon mit -O0 compiliert! Daran 
liegt es nicht!

Andreas S. schrieb:
> Ich habe bereits die Optimierungseinstellungen des Compilers ganz
> ausgeschlatet. Aber die Schleifenvariablen sind und bleiben bei Null!
> Weiß zufällig jemand hier woran es liegen könnte?

von Εrnst B. (ernst)


Lesenswert?

Andreas S. schrieb:
> Daran
> liegt es nicht!

Aber er beschreibt die richtigen Array-Felder, korrekt?

d.H. es wird garantiert irgendwo irgendwie richtig gezählt, nur dein 
Simulator/Debugger zeigt das nicht an.

Ich würde an der Stelle einfach dem Compiler vertrauen. Wenn der eine 
dumme 0…2-For-Schleife nicht hinkriegen würde, wäre das bestimmt schon 
jemandem aufgefallen...
Versuchs vielleicht noch mit Volatile an deinen Schleifenzählern, wenn 
du wirklich unbedingt beim zählen zuschauen willst.

Ansonsten: Bugs im Debugger/Simulator sind *viel, viel* warscheinlicher 
als Bugs im Compiler.

von Martin K. (maart)


Lesenswert?

Deklariere mal die Variablen zusätzlich mit
1
volatile

Wie du mit der Schleife allerdings eine 5x5 Matrix erstellen willst, 
musst du mir noch erklären.

von Andreas S. (schunki)


Lesenswert?

Martin Kreiner schrieb:
> Deklariere mal die Variablen zusätzlich mitvolatile

Hatte ich auch schon probiert --> gleiches Ergebnis!

Martin Kreiner schrieb:
> Wie du mit der Schleife allerdings eine 5x5 Matrix erstellen willst,
> musst du mir noch erklären.

Die Punkte in meinem Code deuten an, dass die Funktion da noch weiter 
geht!


Mittlerweile habe ich noch ein bisschen rum probiert und festgestellt, 
dass die Probleme mit den Schleifenvariablen nur dann auftauchen, wenn 
ich sie in einer Funktion einsetze die als Rückgabewert meinen struct 
haben. Also in meinem Fall die Stuktur die ich mit
1
struct Matrix3x3{
2
  double data[3][3];
3
  double Determinante;
4
};
5
typedef struct Matrix3x3 Matrix_3x3;

definiert habe.

von Oliver (Gast)


Lesenswert?

Andreas S. schrieb:
> Weiß zufällig jemand hier woran es liegen könnte?

Frag halt Atmel oder Microsoft, warum deren Debugger das nicht richtig 
anzeigt, oder schreib denen einen bug-Report.

Oliver

von Εrnst B. (ernst)


Angehängte Dateien:

Lesenswert?

Dann erklär nochmal dein Problem:

Ist es, dass du dem (simulierten) µC beim Zählen bis drei zusehen 
willst, das aber nicht klappt, oder ist es, dass deine Berechnung 
schiefgehen, weil die Schleife nicht dreimal durchlaufen wird?

Wenn ich deinen Quelltext soweit zusammenkopiere und kompiliere, dann 
schaut das alles problemlos & richtig aus.

Kommt zwar mords-umständlicher ASM-Code bei raus (16 Bit für eine 
Schleifen-Zählvariable, die nur bis 3 zählt...) aber, es wird gezählt:

...
1
.LM5:
2
        ldd r24,Y+1
3
        ldd r25,Y+2
4
        cpi r24,3    ;   <<< "spalte < 3"
5
        cpc r25,__zero_reg__
6
        brge .+2
7
        rjmp .L4
8
        .stabn  68,0,16,.LM6-.LFBB1
9
.LM6:
10
        ldd r24,Y+3
11
        ldd r25,Y+4
12
        adiw r24,1  ; <<< "zeile++"
13
        std Y+4,r25
14
        std Y+3,r24
15
.L2:
16
        .stabn  68,0,16,.LM7-.LFBB1
17
.LM7:
18
        ldd r24,Y+3
19
        ldd r25,Y+4
20
        cpi r24,3   ;  <<< "zeile < 3"
21
        cpc r25,__zero_reg__
22
        brge .+2
23
        rjmp .L5
...

von Andreas S. (schunki)


Lesenswert?

Oliver schrieb:
> oder schreib denen einen bug-Report.

Hab ich schon gemacht!

Εrnst B✶ schrieb:
> aber, es wird gezählt:

Sag ich ja! Nach drei Durchläufen springt er aus der Schleife! Auch wenn 
im Simulator die Zähvariable konstant auf NULL bleibt!

von Stefan W. (stefanini)


Lesenswert?

Auch wenn es schon älter ist,hatte das gleiche Problem.
Man muß bei den Projekt Properties All Configurations anwählen
und die Compileroptimierung ausschalten,dann sollte es funktionieren

von Stefan F. (Gast)


Lesenswert?

> Man muß ... die Compileroptimierung ausschalten

Toll.
Das steht schon weiter oben, hat in diesem Fall aber nicht geholfen.

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.