Gast
#846336
Hallo allerseits,
für einen Kunden hab' ich eine Schaltung mit einem Tiny861 /AVR GCC
entwickelt und nächste Woche will er diese in einem Gerät ausstellen,
doch irgendwo ist der Wurm drin.
Das Programm auf dem Controller scheint abzustürzen und zwar auf eine
Art und Weise, die ich mir nicht aufgrund eines möglichen Fehlers im
Code erklären kann.
Das kleine Segment unten zeigt einen Code- Ausschnitt.
Irgendwo im Programm wird ein Buzzer angesteuert, der eine Tonfolge
ausgibt. Der Aufruf der beiden "play_tone" Funktionen erfolgt direkt
hintereinander, sollte also auch durch einen Programmfehler nicht
gestört werden können.
Dennoch meldete der Kunde, dass das System eindeutig bei einem Ton
hängen blieb und bis zum Reset der Schaltung andauernd den einen Ton
ausgab. Dies passierte ein einziges Mal innert 10 Stunden Testzeit.
Wie kann so etwas passieren?
Deutet dies vielleicht auf einen Stack- Overflow hin und wie kann ich
dies ausschliessen?
Das Programm beinhaltet noch zwei ISRs: TIMER1_OVF sowie TIMER0_CAPT.
Die Allokation aller Variablen wurde dem GCC überlassen; es sollte also
nicht zu Ueberlappungen kommen.
Kann es sein, dass ich beim Compilieren etwas falsch einstellte? Die
eingestellten Optionen, siehe ganz unten in dieser Mail.
Was könnte es sonst sein?
Vielen herzlichen Dank für jede Hilfe!
Gruss, Tobias
_____________________________________________________
//Buzzer an PA2
#define BUZZER_INV PORTA ^= 0x04
#include <util/delay.h>
....
if(...){
play_tone(249, 84.9);
play_tone(264, 73.5);
}
...
void play_tone(unsigned int length, double period){
do{
_delay_us(period);
BUZZER_INV;
} while(length--);
BUZZER_OFF; //switch off buzzer
}
_____________________________________________________
-gdwarf-2
-std=gnu99
-Wall
-mcall-prologues
-DF_CPU=8000000UL
-O2
-funsigned-char
-funsigned-bitfields
-fpack-struct
-fshort-enums
(O2, da der Speicher langsam knapp wird)