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.
Hallo! Mache das Kopieren der Daten in einer Task mit einer hohen Prioritaet und synchronisiere sie mit dem Interrupt mit einer Semaphore. Gruesse Thomas
Normalerweise benutzt man den Interrupt des Ethernetcontrollers, um einen DMA zu starten.
@ 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.