www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik FreeRTOS zu bestimmten Task wechseln


Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
ich schreibe gerade einen Ethernet-Treiber für den DM9000B. Das ganze 
läuft unter FreeRTOS im Preemptiven Modus.

Nun habe ich aber Probleme mit dem Ethernet-IC, wenn zu schnell, viele 
Daten empfangen werden. In diesem Fall scheint der IC überrannt zu 
werden und nix geht mehr, da hilft nur noch ein Reset des IC.

Ich kann das Problem lösen, indem ich die Daten aus dem Ethernet-Chip 
noch im Interrupt auslese. Dann ist das auslesen schneller als das 
füllen des Speichers im Ethernet-IC. Normalerweise hatte ich einen Task 
der das Auslesen übernommen hat, wenn ein Flag aus dem Interrupt heraus 
gesetzt wurde.

Die Interrupt-Lösung funktioniert zwar, es scheint mir aber nicht gut zu 
sein, so langwierige Geschichten wie Daten kopieren im Interrupt zu 
machen. Lieber wäre es mir, dies, wie ursprünglich angedacht, in einem 
Task zu tun.

Gibt es die Möglichkeit im FreeRTOS, aus einem Interrupt heraus, in 
einen bestimmten Task zu wechseln? Oder wie könnte man dieses Problem 
besser lösen? Es dauert einfach zu lange, bis der Task, zum Auslesen, 
dran kommt.

Autor: Thomas K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Mache das Kopieren der Daten in einer Task mit einer hohen Prioritaet 
und synchronisiere sie mit dem Interrupt mit einer Semaphore.

Gruesse
Thomas

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Normalerweise benutzt man den Interrupt des Ethernetcontrollers, um 
einen DMA zu starten.

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Thomas
Danke für den Tipp, genau das habe ich auch mittlerweile aus der 
Api-Doku raus gelesen. Und es funktioniert auch erstmal ganz gut.

@  Nebliger
Das kann man durchaus machen, mein Plan ist das aber erstmal nicht. 
Zumal die Fehlersuche noch schwieiriger wird, wenn der DMA im Spiel ist.

Autor: Star Keeper (starkeeper)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also im Endeffekt lag mein Problem garnicht im zu langsammen auslesen 
der Daten vom Ethernet-IC sondern in der nicht vollständig gelesenen 
Doku des STM32 :-)

Beim Cortex-3 sind die Interrupt Prios verdreht, also 255 die niedrigste 
und 0 die höchste. Bei mir liefen die Interrupts alle auf Priio 0.
Durch die Interrupts, die den FreeRTOS Kernel unterbrochen haben sind 
dann wohl irgendwelche Dinge durcheinander geraten. Nachdem ich nun 
meine Prioritäten sortiert habe läuft es stabil.

Wenn man z.B. eine Semaphore setzt, aus einem Interrupt heraus, dessen 
Prio höher ist als "configMAX_SYSCALL_INTERRUPT_PRIORITY" gibts früher 
oder später zwangsweise knartsch.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.