Forum: Mikrocontroller und Digitale Elektronik Probleme bei der Programmcodeerstellung zwischen -O0 und -Os Einstellung


von Thomas (Gast)


Lesenswert?

Hallo,

Ich habe hier ein etwas umfangreicheres Programm programmiert welches 
auf einem MEGA128 laufen soll.
Ich verwende AVR Studio 4.17 Build666 mit GCC Plugin WinAVR-20090313.

Etwas zu meinem Projekt, ich spreche periodisch externe Geräte per RS485 
an (Master-Slave Mode) je mach ACK wird eine Aktion gestartet 
desweiteren lese ich eine Tasterturmatrix auch periodisch aus.
Ein angeschlossenes Display ist mit einer Displaysteuerung versehen in 
der ich Programmparameter anpassen kann. Desweiteren habe ich noch 5 
galvanisch getrennte Eingänge und 5 Relaiausgänge.
Das ganze Programm ist Interruptgesteuert USAT,Timer usw.
Ich habe den Ablauf als Tasks programmiert die wiederum auf Timer 
reagieren die gepullt werden in der ISR.

Da ich bis jetzt noch keine Platzprobleme im Flash hatte habe ich immer 
mit -O0 übersetzt das auch das debuggen per JTAG vereinfachte.
Nun habe ich jedoch das Problem das der Flash nun zu 96% voll ist was 
mit der recht umfangreichen Menusteuerung zu tun hat da die Strings im 
Flash liegen.

Ich habe nun versucht die Optimierung von -O0 auf -Os umzustellen.
Dabei hagelte es einige Fehler die ich mit einem Eintrag in 
Projekt->Config.Options->Custom Options->Custom Compilation Options
"-lc" und "-lm" beheben konnte.

Dies wurde hier im Forum diskutiert im Bezug mit der math.h oder so.
Obwohl ich dies nicht verwende habe ich die Einstellungen mal probiert 
und sofort keine Fehler mehr.

Wenn ich jedoch das Programm übersetze und in der uC übertrage 
funktionieren einige Programmteile nicht mehr.
zB. die Tasterturmatix kann nicht mehr verwendet werden.
Wenn ich nun in den debug mode gehe um mir die Variablen anschauen zu 
können zeigt mir Watch die Variable mit "Location not valit" an obwohl 
diese vier Zeilen oberhalb mit unsigned char variable deklariert wurde.

Stelle ich die Optimierung wieder auf -O0 funktioniert wieder alles 
wunderbar.

Hat jemand eine Idee oder einen Tipp an was es liegen könnte.

Ich beschäftige mich sein ca. 1.5 Jahren mit uC und bin daher nich so 
der Profi. Ebenso bin ich mir nicht sicher ob ich in Config.Options alle 
richtig eingestellt habe.

Danke

Thomas

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Hat jemand eine Idee oder einen Tipp an was es liegen könnte.
Verzögerungsschleifen mit for() programmiert?
Globale Variablen die in Interrupts und woanders verwendet werden müssen 
volatile deklariert werden.

Genaueres lässt sich nur anhand des Programmcodes sagen...

von Stefan E. (sternst)


Lesenswert?

> Das ganze Programm ist Interruptgesteuert USAT,Timer usw.
> ...
> Ich habe nun versucht die Optimierung von -O0 auf -Os umzustellen.
> ...
> Wenn ich jedoch das Programm übersetze und in der uC übertrage
> funktionieren einige Programmteile nicht mehr.

Da hast du dann wohl ein paar "volatile" vergessen.

von Oliver (Gast)


Lesenswert?

>Ich habe nun versucht die Optimierung von -O0 auf -Os umzustellen.
>Dabei hagelte es einige Fehler die ich mit einem Eintrag in
>Projekt->Config.Options->Custom Options->Custom Compilation Options
>"-lc" und "-lm" beheben konnte.

Es wäre trotzdem interessant zu wissen, was das für Fehlermeldungen 
waren.

>Wenn ich nun in den debug mode gehe um mir die Variablen anschauen zu
>können zeigt mir Watch die Variable mit "Location not valit" an obwohl
>diese vier Zeilen oberhalb mit unsigned char variable deklariert wurde.

Beim Optimieren verschwindet sowas für den Debugger gerne mal. Probier 
mal -O1, damit versteht sich der Debugger besser, und das Programm wird 
trotzdem kleiner.

Ansonsten bleiben die oben schon genannten typischen Fehler.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

Und fürs nächste mal merken.

Zwischendurch immer wieder auch mal mit dem Optimizer arbeiten und 
nachsehen, ob noch alles funktioniert, damit man solche Probleme 
frühzeitig erkennt. Nichts ist schlimmer als einen Haufen Code zu haben, 
der nicht funktioniert und keinen blassen Schimmer zu haben, wo man 
anfangen soll.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

@Oliver,

ich habe nun wieder an den Einstellungen gedreht und nun kommt die 
Fehlermeldung wieder mit einstellung -Os, hänge sie mal hier an.

Die Zeile ist eine Struktur die Variable ist volatile deklariert
1
AllLeser[count].connectionError = INIT;  //Kommunikationserrorzähler zurücksetzen
Mit der Einstellung -O1 scheint alles zu funktionieren zumindest habe 
ich keine Fehler gefunden bzw. das etwas nicht funktioniert.
Das komische ist nur das alle Variablen die ich bei der Auswertung der 
Tasterturmatrix verwende nur dort verwendet werden innerhalb dieser 
Funktion.
Habe mal zum testen alle verwendeten Variablen als volatile deklariert 
und das Ergebnis ist das gleiche also kein Unterschied.

@ KarlHeinz,

danke für die klaren Worte da ich es jetzt weis werde ich es in Zukunft 
heherzigen, jetzt ist es zu spät. LEIDER :-(

Mit der -O1 Optimierung sollte mir jedoch der Speicher reichen.

Trotzdem ist es komisch.

Thomas

von (prx) A. K. (prx)


Lesenswert?

Thomas schrieb:

> ich habe nun wieder an den Einstellungen gedreht und nun kommt die
> Fehlermeldung wieder mit einstellung -Os, hänge sie mal hier an.

Klingt nach relativem Sprung, der weiter springen soll als er kann. Ist 
da eine derart riesige Funktion drin?

von Thomas (Gast)


Lesenswert?

@A.K.,

verstehe Deine Frage nicht?

Wenn Du den Sprung wegen der Optimierungseinstellung meinst, dann will 
ich das nur machen damit ich noch etwas Flash frei habe da es ansonsten 
eng werden könnte.
Im Prinzip ist mir die Optimierung egal solange der Code draufpasst doch 
mit -O0 wird es eben zu eng, -01 wird reichen und funktioniert.

Puuuhhhhh nochmal Schwein gehabt.

Thomas

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.