Forum: Mikrocontroller und Digitale Elektronik PIC24/dsPIC33: DMA- und CPU-Zugriff verriegeln?


von DJ T. (Gast)


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!

von Michl (Gast)


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.

von Ste N. (steno)


Lesenswert?

Oder gleich den eingebauten DMA FIFO Buffer des ECAN-Moduls verwenden...

Beste Grüße!

von DJ T. (Gast)


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

von Michael H. (morph1)


Lesenswert?

Mal das Datenblatt vom DMA gelesen?
Würde sagen der Ping-Pong-Mode wird dein Problem lösen können :)

So ichs denn korrekt verstanden habe.

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.