Domanda

Sto cercando di ottenere 2 compiti da correre nella mia dinamica C sotto Micrium UC-OS / II.Un compito è il gestore HTTP, l'altra legge dalla porta seriale.L'attività della porta seriale sembra inibire l'attività HTTP da corsa.Qualche idea perché è?Pensavo che UC-OS / II fosse preective.

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

 while(1) {
  http_handler();
 }
}

void gpstask(void* ptr) {

 int c;

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

Entrambe le filettature sono impostate sulla stessa priorità predefinita.

È stato utile?

Soluzione

UC / OS-II è preventivo, ma solo in una direzione - preventirà un filo con priorità inferiore per consentire a un thread prioritario più alto da eseguire, ma non farà il retro.Vale a dire, i fili più alti di priorità devono rinunciare esplicitamente il controllo della CPU per consentire l'esecuzione dei fili prioritari più bassi.Scommetto che il tuo filo seriale è una priorità più alta del filo http e che serFgetc() non rinuncia a controllare il controllo (tramite OSMboxPend o OSTimeDly o qualche altra routine).

Prova a creare il filo seriale il thread prioritario più basso nel sistema o mettere qualcosa nel suo codice per consentirgli di rinunciare al controllo della CPU.(Ad esempio, in attesa di un semaforo quando non sono disponibili caratteri, quale semaforo è possibile postare da un interrupt disponibile da dati.) Dovrebbe funzionare.

Altri suggerimenti

UC / OS-II supporta solo priorità uniche.Inoltre hai bisogno di qualcosa come ostimatamente (x) o qualche altro elemento nei loop dell'attività per rinunciare al controllo allo scheduler.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top