MICRIUM UC-OS / II su Dynamic C / Rabbit - potrebbe avere la partenza del compito
-
13-09-2020 - |
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.
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.