PIC32-UART-ISR "versumpf"

Gast #3725539
Lesenswert?

Hi zusammen,

ich bräuchte mal eure Hilfe. Ich habe eine UART-ISR auf
einem PIC32. Diese wird nur zum Empfang von Zeichen benutzt
und wird etwa 500 - 1000 mal pro Sekunde aufgerufen.
Funktioniert auch prima, auch über längere Zeit hinweg.

Wenn ich jetzt parallel Traffic auf dem CAN erzeuge,
dann "versumpft" die UART-ISR. Sie wird nicht mehr aufgerufen.
Womöglich weil ein Overrun stattfindet oder sonst eine
Fehlersituation auftritt.

Ich habe einen Timer, der etwa alle Sekunde prüft,
ob und wie oft die ISR aufgerufen wurde. Damit kann ich
recht gut und schnell erkennen, ob das Problem aufgetreten ist.
Nun dachte ich mir, ich könnte zumindest den UART und die ISR
neu aufsetzen, aber auch nach Abschalten des UART,
Disablen des Interrupts, neu initialisieren des Interrupts
und Freigabe der Interrupts kommen keine Zeichen kann
(es werden hier übrigens die gleiche Funktionen für UART und ISR
benutzt, wie beim ersten Aufsetzen und Starten).
Händisches Aufrufen der UART-ISR habe ich schon probiert,
ebenso eine Abfrage der (RX, TX, ERR) - Interruptflags
mit Zurücksetzen.

Wenn ich stattdessen einen SoftReset auslöse,
dann geht es, aber der Prozessor (das Programm) läuft
dann natürlich auch wieder von vorne los.

Es schau aus, als würde sich der UART oder der Interrupt
Controller irgendwie verhaken...

War jemand mal in einer ähnlichen Situation?
Oder jemand eine Idee wie ich das lösen könnte?

Grüße,
Peter
Gast #3725923
Lesenswert?

Hallo,

das ist ein tolles Problem, ich liebe soetwas.
Das kann man mit Debuggen fast nicht finden.

Da kann man nur eingrenzen:
Einzelne Funktionsblöcke ausschalten, bis es nicht mehr auftritt. Dann 
kennt man schon mal grob die Problematische Stelle. Anfangen tut man mit 
großen Blöcken (z.B. CAN) und verfeinert dann weiter (z.B. Receive 
auskommentieren).

Indizes von Arrays oder irgendwelche Pointer sind ein heißer Tipp.

Ich würde mir zuvor mit dem Debugger folgendes anschauen
- werden die beiden Interrupt Enable - Flags für die UART-Interrupts 
zurckgesetzt, wenn der Fehler auftritt?
- wird die Priorität der UART-Interrupts verändert?
- gibt es irgendwas, dass die Interrupts auf "single vector" 
zurückdreht?
- Hängt dein Code für längere Zeit in einer höherprioren ISR fest, z.B. 
der vom CAN?
Gast #3725999
Lesenswert?

Vielen Dank für die Tipps!

Es scheint, als wäre die fehlende Overrun-Behandlung
in der ISR das Problem gewesen. Es gibt scheinbar keine Funktion
in der PLIB, mit der man das Overrun-Flag löschen kann,
daher habe ich dies jetzt in der ISR und beim Init per direktem
Registerzugriff eingebaut. So ist der Overrun jetzt nicht
mehr so kritisch, falls er wirklich einmal auftreten sollte,
SoftReset ist daher nicht mehr nötig.

Nächster Schritt ist dann noch die Vermeidung des Overruns.
Der UART benötigt hier eine höhere Prio im Gegensatz zum CAN.

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