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
> 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...
> 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.
>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
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.
@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
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?
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.