Overrun-Fehler mit zwei USART-interrupts

Mit zwei USARTs läuft auf 115200 baud auf einem STM32F2, eine Kommunikation mit einem radio-Modul und eine für die serielle vom PC. Die Taktfrequenz 120MHz.

Beim empfangen von Daten von beiden USARTs gleichzeitig overrun-Fehler kann auftreten, auf einem USART oder die andere. Tun einige schnelle Rückseite der Umschlag Berechnungen es sollte genügend Zeit zur Bearbeitung sowohl, als die interrupts sind einfach nur kopiere das byte in Ringpuffer.

Sowohl In der Theorie und aus der Messung der interrupt-code, um push-byte-Puffer-soll/muss in der Reihenfolge ausgeführt, von 2-4µS, bei 115200 baud haben wir rund 70us zu verarbeiten jeden char.

Warum sehen wir gelegentliche Erze auf die eine oder andere USART?

Update - weitere Informationen:

  1. Keine anderen ISRs in unserem code sind brennen in dieser Zeit.
  2. Wir laufen Keil RTX mit systick-interrupt konfiguriert, um das Feuer alle 10mS.
  3. Wir sind nicht der Deaktivierung der interrupts zu diesem Zeitpunkt.
  4. Nach diesem Buch (Dem Designer ' s Guide to the Cortex-M Prozessor-Familie) die Interrupt-Latenzzeit ist um 12cycles (nicht wirklich aggressiv)

Angesichts all der oben 70us ist mindestens ein Faktor von 10 über der Zeit, wir nehmen Sie zum löschen der interrupts - also ich bin mir nicht sicher, seine so einfach zu erklären. Sollte ich zu dem Schluss, dass es muss einen anderen Faktor bin ich über die Suche?

MDK-ARM version 4.70

Den systick-interrupt verwendet wird, durch den RTOS-also nicht mal die anderen ISRs 2-3µS laufen pro byte.

  • Sie haben nicht genug Informationen für jemanden zu sagen, warum Sie speziell sind immer überrollt. Offensichtliche Kandidaten: Deaktivieren von interrupts woanders? Höhere Priorität interrupt-handler zu langsam? Fehler im code? Nicht genug Informationen, um herauszufinden, welche.
  • ISR Latenz ist ziemlich tödlich auf, dass die chip -, die UARTs nicht über einen fifo-Puffer. Ihre theoretische Berechnung ist bereits um den Faktor zwei. Hinzufügen von höherer Priorität unterbricht dessen ISR zu viel Zeit oder unterbricht immer deaktiviert im code, den Sie nicht kennen, und einen überlauf bekommt, um einfach zu erklären.
  • Vielen Dank für die Kommentare, die ich Hinzugefügt habe, sind einige weitere Informationen zu der Frage, ich bin mir nicht sicher, welche anderen Informationen, die ich bieten kann.
  • Welche version von RTX (oder ARM-MDK)? Frühe Versionen für Cortex-M3 hatte bugs und nicht voll und ganz unterstützen interrupt-Priorität gruppieren. Vielleicht ist die Frage nicht zu beantworten ohne den code.
  • Wie lange dauert die systick-interrupt zur Ausführung? Kann der systick-ISR unterbrochen werden die USART-interrupts? Was ist die interrupt-Latenz für alle drei?
  • Ich gehöre nicht zu geben bis auf ein ungeklärtes problem dar, da die Symptome zeigen, bis später anderswo. Noch, für meine letzten Projekte habe ich immer schon mit DMA zu erstellen, die einem Ringpuffer speichert die empfangenen Daten vom USART. Eigentliche hardware (DMA-controller) einfach nicht verpassen Termine (es sei denn, es ist zu überladen, aber es sei denn, du verwendest es für etwas anderes, 2 USARTs zu diesem Kurs sollte ein Stück Kuchen).
  • Ist es möglich, dass der Prozessor schlief zu der Zeit? Laut Datenblatt, das aufwachen aus dem stop-Modus kann normalerweise nehmen 110 uns in gewissen Umständen, und aufwachen aus dem standby-Modus dauert mindestens 260 uns. Auch kann man ein kleines Projekt, entfernen Sie so viel code wie möglich, also reproduziert diesen bug? Vor allem, wenn Sie aus jeder anderen unterbrechen (einschließlich der RTOS) und nicht immer legen Sie den Prozessor in den sleep-Modus. Das könnte ein Anzeichen für irgendeine Art von hardware-Fehler (die Art, die sollte gehen in ein errata-Blatt).
  • Sie können nicht deaktivieren interrupts vollständig, aber tun Sie Ihre PRIMASK hoch genug, um deaktivieren Sie den UART-interrupts (möglicherweise versehentlich)? Ich weiß, FreeRTOS wird dies auf dem CM3, damit Sie noch "schnelle" interrupts, die nicht mit dem OS, aber Sie brauchen, um über eine bestimmte Priorität zu.

Schreibe einen Kommentar