Guten Morgen, vielleicht stehe ich ja nur auf der Leitung. Aber folgende Zeilen wollen nicht: const uint16_t LED[9][10] PROGMEM = {{0, 0, 549, 1098, 1647, 2196, 2745, 3294, 3843, 5856}, {0,0,0,0,0,0,0,0,0,0}, {0, 5000,4451,3902,3353,2804,2255,1706,1157,810}, {0,1098,2196,3294,4392,5490,6588,7686,8784,13176}, {0,0,0,0,0,0,0,0,0,0}, {13333,8902,7804,6706,5608,4510,3412,2314,1216,157}, {732,1098,1647,2196,2745,3294,3843,4392,4941,0}, {0,0,0,0,0,0,0,0,0,0}, {5935,3902,3353,2804,2255,1706,1157,608,59,0}}; (Entschuldigung für die miese Formatierung) Wenn ich aufrufe(n will): uint16_t test; test = LED[0][0]; Und einen Breakpoint auf die Zeile test = ... lege, dann sagt die IDE, dass dieser Punkt nie erreicht wird. Scheinbar optimiert der Compiler die kompletten Codezeilen weg. Weiß jemand, warum das so ist?
Martin Schwaikert schrieb: > (Entschuldigung für die miese Formatierung) dann machs besser > uint16_t test; > test = LED[0][0]; > > > > Und einen Breakpoint auf die Zeile test = ... lege, dann sagt die IDE, > dass dieser Punkt nie erreicht wird. Scheinbar optimiert der Compiler > die kompletten Codezeilen weg. > > Weiß jemand, warum das so ist? weil die Variable test nirgends verwendet wird? (Dir ist auch klar, dass du so nicht an den Wert im Array rankommst? Da das PROGMEM ist, musst du mit den entsprechenden pgm_read_.... Funktionen darauf zugreifen um an die Werte zu kommen).
Karl Heinz Buchegger schrieb: > Martin Schwaikert schrieb: > >> (Entschuldigung für die miese Formatierung) > > dann machs besser Oh, ich habe die Tags total übersehen. Tut mir leid. >> uint16_t test; >> test = LED[0][0]; >> >> >> >> Und einen Breakpoint auf die Zeile test = ... lege, dann sagt die IDE, >> dass dieser Punkt nie erreicht wird. Scheinbar optimiert der Compiler >> die kompletten Codezeilen weg. >> >> Weiß jemand, warum das so ist? > > weil die Variable test nirgends verwendet wird? Dann reicht die Zuweisung nicht aus, um dem Compiler eine Verwendung zu signalisieren? > (Dir ist auch klar, dass du so nicht an den Wert im Array rankommst? Da > das PROGMEM ist, musst du mit den entsprechenden pgm_read_.... > Funktionen darauf zugreifen um an die Werte zu kommen). Nein, das war mir nicht klar. Muss es überhaupt über PROGMEM ablaufen?
Martin Schwaikert schrieb: >> weil die Variable test nirgends verwendet wird? > > Dann reicht die Zuweisung nicht aus, um dem Compiler eine Verwendung zu > signalisieren? Überleg mal. Würde sich am Verhalten deines Programms (also jetzt nicht im Debugger, sondern das was du zb in Ausgaben oder an den Port Pins siehst) irgendetwas ändern, wenn diese Zuweisung nicht im Programm ist? Wenn deine Antwort 'nein, da würde sich nichts ändern; ob die Variable da ist oder nicht, spielt so gesehen keine Rolle' lautet, dann kann der Compiler das wegoptimieren. > Nein, das war mir nicht klar. Muss es überhaupt über PROGMEM ablaufen? Das musst du wissen, ob du die so viele Werte hast, dass du sie aus dem SRAM weghaben und im Flash haben willst.
Karl Heinz Buchegger schrieb: > Martin Schwaikert schrieb: > >>> weil die Variable test nirgends verwendet wird? >> >> Dann reicht die Zuweisung nicht aus, um dem Compiler eine Verwendung zu >> signalisieren? > > Überleg mal. > Würde sich am Verhalten deines Programms (also jetzt nicht im Debugger, > sondern das was du zb in Ausgaben oder an den Port Pins siehst) > irgendetwas ändern, wenn diese Zuweisung nicht im Programm ist? > > Wenn deine Antwort 'nein, da würde sich nichts ändern; ob die Variable > da ist oder nicht, spielt so gesehen keine Rolle' lautet, dann kann der > Compiler das wegoptimieren. Gut, das sehe ich ein. Ich dachte allerdings, im Debugmodus optimiert der Compiler nicht. So kann man sich täuschen. >> Nein, das war mir nicht klar. Muss es überhaupt über PROGMEM ablaufen? > > Das musst du wissen, ob du die so viele Werte hast, dass du sie aus dem > SRAM weghaben und im Flash haben willst. Ach jetzt. Ok. Dass geht mir ein.
Gut. Ich habe das PROGMEM rausgeschmissen. Aber auch mit folgenden Zeilen wird wegoptimiert:
1 | |
2 | |
3 | |
Jetzt wird die Variable doch eigentlich verwendet?
Gast
#2574990
Martin Schwaikert schrieb: > Aber auch mit folgenden > Zeilen wird wegoptimiert: woher weist du das? Wird der code überhaupt aufgerufen? Zeig bitte eine completten quellcode.
Ich habe nen Haltepunkt auf die Codezeile mit der Portzuweisung und eine Überwachung auf die test-Variable. Die IDE sagt dazu nur: "Variable: test, Value: Optimized away". LEDRGB.h
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
main.cpp
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
Gast
#2575000
naja test wird ja nicht gebraucht, die Frage ist ob in PORTB das richtig danach drin steht. Da es ja eine konstante ist macht der optimieren vermutlich PORTB = 0;
Hmm... das kann sein. Irgendwie frustrierend, wenn der Compiler soviel mitdenkt. Mal schnell eben kurz ne Zeile Code zum Testen schreiben, um debuggen zu können, ist also heute scheinbar nicht mehr möglich.
Ok Peter, Du hast recht. Ohne Optimierungen läuft das so, wie ich das gerne hätte. Scheinbar streicht er das alles recht radikal zusammen. Vielen Dank. Grüße M. Schwaikert.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.