Hallo Zusammen,
ich habe hier ein kleines Cast-Problem, dass ich ohne Hilfe nicht lösen
kann :-(.
Hiintergrund, ich möchte die FFT-Routine aus diesem Projekt
Beitrag "[C] AVR-Lichtorgel per FFT MEGA8 32 644" , in einem anderen
Projekt einsetzen, hierfür habe ich die ADC-Wandlung in den Interrupt
verlagert und lasse das Array capture dort füllen. Ist das Array
gefüllt, wird ein Flag gesetzt und die Mainroutine macht den Rest. Damit
aber wärend der FFT kein zu großer Leerlauf entsteht, war meine
Überlegung, das Array umzukopieren und die FFT auf der Kopie
durchzuführen. Wärend dessen kann der ADC-Interrupt das Array mit neuen
Daten füllen.
Meine Definition:
Du könntest einfach mit der Warnung leben oder blind casten.
Aber die Warnung sollte dich bei der Programmlogik stutzig machen!
Das volatile ist Hinweis des Programmierers an den Compiler, dass das
capture Feld jederzeit verändert werden kann und jederzeit aktuell zu
halten ist. Daher darf der Compiler dessen Inhalt nicht bekannt
voraussetzen oder Anweisungen zusammenfassen. Die Veränderungen könnten
z.B. von einer nebenläufigen Programmroutine stammen z.B. einer
Interruptroutine, die Messwerte in capture füllt. Mit memcpy soll dann
eine Kopie dieser Messwerte angelegt werden. ABER was ist, wenn die
Interruptroutine nach dem Aufruf von memcpy ändert? Deine Programmlogik
könnte diesen Fall berücksichtigen und den Interrupt vor dem memcpy
sperren und danach wieder freigeben.
Frank Link schrieb:> das Problem:> memcpy( capture, capture_fft, sizeof(capture) );> memset( capture, 0, sizeof(capture) );
Du kopierst den inhalt von capture_fft nach capture, und überschreibst
dann capture mit 0en? Klingt irgendwie sinnlos
Niklas Gürtler schrieb:> Frank Link schrieb:>> das Problem:>> memcpy( capture, capture_fft, sizeof(capture) );>> memset( capture, 0, sizeof(capture) );> Du kopierst den inhalt von capture_fft nach capture, und überschreibst> dann capture mit 0en? Klingt irgendwie sinnlos
Hi Niklas,
wahrscheinlich kannn ich mir das sparen, ist noch aus der Orginalroutine
aus dem oben genannten Artikel.
Ich spiele im Moment nur mit dem Teil rum und schaue, ob ich mit meinem
ATEMAGA88 und den internen 8MHz einen kleinen FFT-Analyzer aufbauen
kann, der bis ca. 20KHz arbeitet.
Gruß
Frank
STK500-Besitzer schrieb:> Warum beschreibst du nicht einfach in der ISR wechselweise das eine oder> das andere Array?
Weil es nur ein Versuch war, ich muss darauf sowieso verzichten, da so
wie es jetzt ist, nur eine FFT mit 64 Stützstellen funktionieren würde,
da mir sonst der Speicher ausgeht.
Da ich aber mit mindestens 128 Stützstellen arbeiten möchte, bringt mir
der doppelte Speicher nichts.
Gruß
Frank