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.