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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.