Cast Problem bei memcpy und memset

OP #2435831
Lesenswert?

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:
1
volatile int16_t capture[FFT_N];
2
int16_t capture_fft[FFT_N];

das Problem:
1
memcpy( capture, capture_fft, sizeof(capture) );
2
memset( capture, 0, sizeof(capture) );

Warning:
1
warning: passing argument 1 of 'memcpy' discards qualifiers from pointer target type

Ich komme leider nicht dahinter, wie ich capture casten muss, damit die 
Warnung verschwindet.

Gruß
Frank
Gast #2435848
Lesenswert?

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.
OP #2435927
Lesenswert?

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
OP #2435930
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren