Forum: Mikrocontroller und Digitale Elektronik Array beschreiben schlägt fehl


von Stephan M. (multimeter90)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe zwei Arrays global definiert.
1
GlobalDefinitions.h
2
3
#ifndef GLOBAL_DEFS_H
4
#define GLOBAL_DEFS_H
5
6
// if EXTERN is not definied, make just declaration of global variables
7
#ifndef EXTERN
8
#define EXTERN extern
9
#endif
10
11
#pragma udata bigdata
12
EXTERN unsigned char LokVsollListe[200];
13
EXTERN unsigned char LokVistListe[20];
14
#pragma udata
15
16
17
#endif

Damit die Arrays in die sections passen habe ich die Linkerdatei 
angepasst (siehe Anhang)
1
Main.c
2
3
#define EXTERN
4
#include "GlobalDefinitions.h"
5
6
#pragma udata bigdata
7
 unsigned char LokVsollListe[200];
8
 unsigned char LokVistListe[20];
9
#pragma udata
10
11
void main() {
12
13
14
}


In der MainFunktion mache ich im Moment nichts anderes, als
1
LokVistListe[0] = 54;
2
LokVistListe[1] = 55;
3
LokVistListe[2] = 56;
4
LokVistListe[3] = 57;
5
LokVistListe[4] = 58;
6
LokVistListe[5] = 59;
7
  
8
// Delay1ms(1);
9
  
10
LokVsollListe[0] = 54;
11
LokVsollListe[1] = 55;
12
LokVsollListe[2] = 56;
13
LokVsollListe[3] = 57;
14
LokVsollListe[4] = 58;
15
LokVsollListe[5] = 59;
16
17
//breakpoint for debugger


Wenn ich das Delay drin lasse und compiliere und danach debugge stehen 
in beiden Arrays die entsprechenden Werte drin. Wenn ich das Delay raus 
nehme und dann nochmal compiliere+debugge stehen nur noch in 
LokVistListe die Werte drin.


Zielhardware ist ein PIC18F4685. Debugger ist der ICD2.

von Karl H. (kbuchegg)


Lesenswert?

Ist dein Optimizer eingeschaltet?


Optimizer dürfen unter anderem
* Zuweisungen an Variablen rauswerfen, wenn die Variable nicht
  lesend benutzt wird
* Anweisungen umgruppieren, solange sich das Ergebnis nicht
  verändert
* Variablen überhaupt entfernen, die nirgends benutzt werden.


D.h. solange nicht klar ist, ob du nicht einem Optimizer-Effekt aufsitzt 
würde ich mir erst mal keine Gedanken machen. Es ist ziemlich 
unwahrscheinlich, dass ein Compiler bei der Zuweisung einer Konstanten 
an ein Array-Element einen Fehler macht.

von Stephan M. (multimeter90)


Lesenswert?

Compiler ist der C18 von microchip in der Lite Version. Diese Version 
hat als einzige Einschränkung, dass man nichts an der Optimierung ändern 
kann.

Wie kann ich mir aber den Unterschied mit zu ohne Delay dazwishen 
erklären?

von Karl H. (kbuchegg)


Lesenswert?

Stephan Meter schrieb:
> Compiler ist der C18 von microchip in der Lite Version. Diese Version
> hat als einzige Einschränkung, dass man nichts an der Optimierung ändern
> kann.
>
> Wie kann ich mir aber den Unterschied mit zu ohne Delay dazwishen
> erklären?

Dazu müsste man erst mal wissen, ob die OPtimierung da überhaupt mit 
reinspielt.

Wenn du die Arrays im Programmcode dann tatsächlich #verwendest#, stehen 
dann die richtigen Werte drinnen?

von Stephan M. (multimeter90)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Dazu müsste man erst mal wissen, ob die OPtimierung da überhaupt mit
> reinspielt.

Ich habe die Optimierung jetzt mal komplett deaktiviert und jetzt stehen 
am breakpoint die Werte in beiden Arrays drin.


> Wenn du die Arrays im Programmcode dann tatsächlich #verwendest#, stehen
> dann die richtigen Werte drinnen?

Ich hatte die Arrays tatsächlich verdendet, also lesend und schreibend. 
Dabei ist mir der fehler erst aufgefallen. Ich verstehe nur nicht, warum 
nur eines der beiden Arrays davon betroffen ist.

von Forest D. (thecomet)


Lesenswert?

Sonst kannst du ja auch ein "volatile unsigned char" benutzen:
1
 volatile unsigned char LokVsollListe[200];
2
 volatile unsigned char LokVistListe[20];

Dann wird es nicht mehr weg optimiert.

von Stephan M. (multimeter90)


Lesenswert?

Wegoptimiert.... ja so kann mans nennen. Wir müssen ja alle sparen :D

von Stephan M. (multimeter90)


Lesenswert?

So, Optimierung wieder an, volatile davor = selbes Problem wie am 
Anfang! So ein Mist.

von Karl H. (kbuchegg)


Lesenswert?

Stephan Meter schrieb:
> So, Optimierung wieder an, volatile davor = selbes Problem wie am
> Anfang! So ein Mist.


Dann vergiss doch mal den Debugger und zeig dein eigentliches Problem 
her.

von Stephan M. (multimeter90)


Lesenswert?

Ohne Debugger ist es mir aufgefallen und danach hab ich genau deswegen 
debuggt. Also das Problem besteht mit und ohne debugger.

Die Arrays werden stellen für jede Lok eine Geschwindigkeit dar 0=0% 
200=100% der Höchstgeschwindigkeit. Im normalen Programm werden Soll- 
und Ist-geschwindigkeit als Bargraph für jede Lok angezeigt (im Moment 
nur die ersten 7 Loks in den Arrays).
Das Problem hat sich so geäußert, dass der Bargraph für die 
Soll-geschwindigkeit 0 war. Also 0 Balken. Vertausche ich die 
Zuweisungen am Anfang vertauscht sich auch das Problem auf das jeweilig 
andere Array.

von Karl H. (kbuchegg)


Lesenswert?

OK.
Du willst also keinen Code zeigen auf das das hier mal wer mit dem 
gleichen Compiler ausprobieren könnte.

Auch gut.

von Stephan M. (multimeter90)


Angehängte Dateien:

Lesenswert?

Du hast ja nicht nach dem Code gefragt. Ich habe dir mein Problem 
beschrieben. Hier sind die relevanten Module.

von Stephan M. (multimeter90)


Lesenswert?

Also was ich noch feststellen konnte:

Die Daten stehen immer nur in dem Array welches zuerst beschrieben 
wurde.

Verkleinere ich die Arraygröße auf 20 (als Beispiel) funktioniert es.

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.