Hallo,
wir sitzen hier gerade vor einem sehr seltsamen Bug.
Es gibt in unserem Programm 2 while schleifen, die nur dann korrekt
durchlaufen werden, wenn im Rumpf einmal printf() ausgeführt wird.
Die Schleifen dienen dazu, abzuwarten, bis von einem Timer ein Flag
gesetzt wird.
1 | while (!(flip_status_reg & (1 << flip_current_decayed))) {
|
2 | printf("loop1");
|
3 | }
|
Das Flag wird auch gesetzt, das haben wir im Timer Interrupt ausgeben
lassen.
Das ist das verrückte,
1 | while (!(flip_status_reg & (1 << flip_current_decayed)));
|
bricht niemals ab.
Die ISR, in der das Flag gesetzt wird:
1 | ISR (TIMER2_OVF_vect) {
|
2 | if(soft_counter_timer2++ >= (F_CPU/(32*256))/(1/0.045)) {
|
3 | soft_counter_timer2 = 0;
|
4 | flip_status_reg |= (1<<flip_current_decayed);
|
5 | if(flip_status_reg & (1 << flip_current_decayed)) {
|
6 | printf("flag gesetzt");
|
7 | }
|
8 | }
|
9 | }
|
mit der gleichen Bedingung wie in der Schleife, das funktioniert auch,
das
Flag wird erkannt und der String ausgegeben.
Wir stehen hier echt auf dem Schlauch, da wir keinen Zusammenhang
zwischen der Schleife und printf erkennen.
Gibt es irgendeinen Fehler, den man machen kann, der zu solch scheinbar
undefiniertem Verhalten führt?
Vielen Dank schonmal