Forum: Mikrocontroller und Digitale Elektronik Cast Problem bei memcpy und memset


von Frank L. (franklink)


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

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi
1
memcpy((void *)capture, capture_fft, sizeof(capture) );
2
memset((void *)capture, 0, sizeof(capture) );

Matthias

von Krapao (Gast)


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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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

von Frank L. (franklink)


Lesenswert?

Danke,
passt...

Gruß
Frank

von STK500-Besitzer (Gast)


Lesenswert?

Warum beschreibst du nicht einfach in der ISR wechselweise das eine oder 
das andere Array?

von Frank L. (franklink)


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

von Frank L. (franklink)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.