FreeRTOS zu bestimmten Task wechseln

OP #1537968
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.
OP #1538211
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.
OP #1539392
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

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