Forum: Mikrocontroller und Digitale Elektronik FreeRTOS zu bestimmten Task wechseln


von Star K. (starkeeper)


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.

von Thomas K. (Gast)


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

von Purzel H. (hacky)


Lesenswert?

Normalerweise benutzt man den Interrupt des Ethernetcontrollers, um 
einen DMA zu starten.

von Star K. (starkeeper)


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.

von Star K. (starkeeper)


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.

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.