PIC24/dsPIC33: DMA- und CPU-Zugriff verriegeln?

Gast #2171549
Lesenswert?

Hallo,

ich benutze im dsPIC33 das ECAN-Modul mit DMA. Wenn eine CAN-Message 
empfangen wird, wird sie vom DMA-Controller automatisch in den 
Messagepuffer (im DMA-RAM) geschrieben.
Wenn ich mit der CPU diesen Messagepuffer auslese, während gerade eine 
neue Message kommt, kann es passieren, daß ich inkonstistente Daten 
bekomme (einige Bytes der alten Message und einige Bytes der neuen 
Message).
Bei einem interrupt-gesteuerten System wäre die Sache klar: Lesen nur 
unter Interruptsperre! Aber wie mach ich das hier mit dem 
DMA-Controller? Den DMA-Kanal kann ich nicht sperren/abschalten, weil 
dieser ja auch noch andere CAN-Messages empfangen können muß.

Ideen?

Danke!
Gast #2171560
Lesenswert?

Hi, das selbe Problem hatte ich im UART. Ich hab es folgendermaßen 
gelöst:

Wenn der DMA-Interrupt kommt schreibe ich den empfangenen Inhalt des 
DMA-Buffers in einen UART-Receive-Buffer (Ringbuffer). Auf diesen habe 
ich wiederum einen Lese- und einen Schreibpointer, sodass ich immer ganz 
genau weiß, welche Daten ich quasi frisch empfangen habe und auch noch 
nicht bearbeitet habe. Die Länge der im DMA-Interrupt zu sicherndnen 
Dadten vom DMA-Buffer in den UART-RX-Buffer entspticht ja jeweils genau 
wieder dem DMAxCNT Register + 1.

Ich hoffe es war einigermaßen verständlich. Kann dir auch Code zeigen 
wenn du willst.
Gast #2175969
Lesenswert?

Hallo,

hab gerade herausgefunden: beim ECAN ist die Lösung trivial:
Wenn vom ECAN eine neue Message in einen Rx-Puffer geschrieben wird, 
wird das "Buffer Full"-Flag gesetzt. Solange dieses gesetzt ist, wird 
der Rx-Puffer nicht überschrieben (weitere Message werden verworfen, 
sofern nicht ein anderer Rx-Puffer für die gleiche CAN-ID konfiguriert 
ist).
D.h. ich kann mit der CPU in aller Ruhe den Rx-Puffer lesen und muß dann 
das "Buffer Full"-Flag am Ende löschen.

Grüße

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