Locala variable wird weg optimiziert, Coocox + GCC

OP #4796173
Lesenswert?

In folgende Function wird mir "n" beim compilen weg optimiziert :
1
//--------------------------------------------------------------
2
// alle LEDs der aktiven WS2812-Kette auf eine Farbe setzen (RGB)
3
// rgb_col : Farbwert (in RGB)
4
// refresh : 0=ohne refresh, 1=mit refresh
5
//--------------------------------------------------------------
6

7
void UB_WS2812_All_Led_RGB(WS2812_RGB_t rgb_col, uint8_t refresh)
8
{
9
  uint32_t n;
10

11
  if(ws2812_channel==0) return;
12

13
  for(n=0;n<ws2812_maxanz;n++) {
14
    ws2812_ptr[n]=rgb_col;
15
  }
16
  if(refresh==1) UB_WS2812_Refresh();
17
}
Es passiert nur bei den STM32 F401RE (nucleo). Beim F407 (discovery) 
functioniert es. Es ist mir unklar warum die sich unterschiedlich 
verhalten. Diese function kommt aus die WS2812 lib von UB. Alles anderes 
functioniert. Ohne optimierung gehts auch.  Selbst wenn ich diese 
variable volatile (local) definiere, wird n noch immer wegoptimiert ?? 
Diese Function wird nur beim "Init" aufgerufen, so jetzt wird die nicht 
verwendet. Wie kann ich das verhinderen ?
OP #4796229
Lesenswert?

Das prgram bleibt hangen an diese Stelle. Beim Debuggen geht es von dort 
kein step mehr weiter. Wenn ich dan die Variable ancklick, sagt der 
debugger mich "weg optimized". Wenn ich dan eine externe volatile 
verwenden, gibt die variabele und geht die auch bis Inhalt 8, aber dan 
stopt er wieder. Ich versuch noch mal bei zuordnung "static".
Danke fur ihre Hinweis.
Gast #4796250
Lesenswert?

Wenns nur um die Variable geht ist das Zauberwort hier "volatile" nicht 
"static".
Letzteres hätte nämlich den Effekt, dass momentane Inhalt der Variablen 
das Ende der Funktion "überlebt" bis zum nächsten Aufruf...

Uli
OP #4796257
Lesenswert?

Hier ein bild von debugger. Auf diese Stelle geht er kein Schritt 
weiter. ISR wirden weiter bearbeitet, aber den normale Ablauf nicht.
De genannte Varibalen sind global declariert :
1
//--------------------------------------------------------------
2
// Globale interne Variabeln
3
//--------------------------------------------------------------
4
uint32_t ws2812_dma_status;
5
uint16_t WS2812_TIMER_BUF[WS2812_TIMER_BUF_LEN];
6
uint8_t  ws2812_channel;
7
WS2812_RGB_t *ws2812_ptr;
8
uint32_t ws2812_maxanz;
Warnings gibt den compiler nicht :
compile:
    [mkdir] Created dir: C:\Users\Jan\Google 
Drive\Coocox_projecten\NucleoF401-COIDE-GPS\nucleof401-gps\Debug\bin
    [mkdir] Created dir: C:\Users\Jan\Google 
Drive\Coocox_projecten\NucleoF401-COIDE-GPS\nucleof401-gps\Debug\obj
       [cc] 24 total files to be compiled.
       [cc] arm-none-eabi-gcc -mcpu=cortex-m4 -mfpu=fpv4-sp-d16 
-mfloat-abi=hard -mthumb -Wall -ffunction-sections -g -O3 -std=c99 -c -
Program Size:
      text     data      bss      dec      hex  filename
     38520     1356     6196    46072     b3f8  NucleoF401-gps.elf

BUILD SUCCESSFUL
Total time: 6 seconds
MFG, RP6Conrad
Angehängte Dateien:
Moderator Persönliche Seite #4796303
Lesenswert?

Jan H. schrieb:
> Diese function kommt aus die WS2812 lib von UB.

Ich kenne diese Funktion und auch die LIB von UB. Ich habe UB bereits 
vor über einem Jahr auf den Fehler in seiner WS2812-Lib hingewiesen.

Der Fehler ist nicht direkt in der Funktion UB_WS2812_All_Led_RGB() zu 
finden, sondern dort, wo sie aufgerufen wird.

Die Variable ws2812_dma_status muss volatile definiert werden, denn sie 
wird in einer ISR gesetzt. UB_WS2812_All_Led_RGB() wird aber abhängig 
von ws2812_dma_status aufgerufen. Das geht dann in die Hose.

Solche Fehler hat UB nicht nur dort, sondern auch in vielen anderen 
seiner Libs, nämlich überall, wo eine ISR zum Tragen kommt. Er schreibt 
daher selbst auf seiner Webseite, dass man seine Libs nur ohne 
Compileroptimierungen verwenden soll.

Das ist aber ein Trugschluss. Man muss nur die richtige Einstellungen 
für die Variablen treffen, welche in ISRs verändert werden. Dann klappts 
auch mit der Optimierung.

Schreibe also:
1
volatile uint32_t ws2812_dma_status;
statt:
1
uint32_t ws2812_dma_status;

EDIT:

Jan H. schrieb:
> -g -O3

Eben: Optimierten Code debuggen geht (meist) nicht. Deshalb zeigt Dir 
der Debugger auch die falsche Stelle an. Nimmst Du die Optimierung raus, 
wird der Fehler aber nicht mehr auftreten - so wie es UB auf seiner 
Webseite auch beschreibt.

Deshalb: Lass die Optimierung drin, definiere ws2812_dma_status als 
volatile und alles wird laufen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren