Frage

Ich versuche, zwei Aufgaben in meinem Dynamic C unter Micrium uC-OS/II zum Laufen zu bringen.Eine Aufgabe ist der http-Handler, die andere liest von der seriellen Schnittstelle.Die serielle Port-Task scheint die Ausführung der http-Task zu verhindern.Irgendwelche Ideen, warum das so ist?Ich dachte, uC-OS/II wäre präventiv.

void httptask(void* ptr)
{
 http_init();

 while(1) {
  http_handler();
 }
}

void gpstask(void* ptr) {

 int c;

 while (1) {
        c = serFgetc();
    }
}

Beide Threads haben die gleiche Standardpriorität.

War es hilfreich?

Lösung

uC/OS-II ist präventiv, aber nur in eine Richtung – es verhindert einen Thread mit niedrigerer Priorität, um die Ausführung eines Threads mit höherer Priorität zu ermöglichen, aber nicht das Gegenteil.Das heißt, Threads mit höherer Priorität müssen explizit die Kontrolle über die CPU aufgeben, um Threads mit niedrigerer Priorität die Ausführung zu ermöglichen.Ich wette, dass Ihr serieller Thread eine höhere Priorität hat als der HTTP-Thread, und das auch serFgetc() gibt die Kontrolle überhaupt nicht auf (durch OSMboxPend, oder OSTimeDly oder eine andere Routine).

Versuchen Sie entweder, den seriellen Thread zum Thread mit der niedrigsten Priorität im System zu machen, oder fügen Sie etwas in seinen Code ein, damit er die Kontrolle über die CPU aufgeben kann.(Warten Sie beispielsweise auf ein Semaphor, wenn keine Zeichen verfügbar sind. Dieses Semaphor können Sie über einen datenverfügbaren Interrupt senden.) Beides sollte funktionieren.

Andere Tipps

uc / os-ii unterstützt nur einzigartige Prioritäten.Sie benötigen auch etwas wie Ostimed (X) oder ein anderes Element in Ihren Aufgabenschleifen, um den Scheduler die Kontrolle aufzugeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top