Pregunta

Estoy intentando ejecutar 2 tareas en mi Dynamic C bajo Micrium uC-OS/II.Una tarea es el controlador http, la otra lee desde el puerto serie.La tarea del puerto serie parece inhibir la ejecución de la tarea http.¿Alguna idea de por qué es esto?Pensé que uC-OS/II era preventivo.

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

 while(1) {
  http_handler();
 }
}

void gpstask(void* ptr) {

 int c;

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

Ambos subprocesos están configurados con la misma prioridad predeterminada.

¿Fue útil?

Solución

uC/OS-II es preventivo, pero solo en una dirección: se adelantará a un subproceso de menor prioridad para permitir que se ejecute un subproceso de mayor prioridad, pero no hará lo contrario.Es decir, los subprocesos de mayor prioridad deben ceder explícitamente el control de la CPU para permitir que se ejecuten los subprocesos de menor prioridad.Apuesto a que su hilo serial tiene mayor prioridad que el hilo HTTP, y eso serFgetc() no cede el control en absoluto (a través de OSMboxPend, o OSTimeDly o alguna otra rutina).

Intente hacer que el subproceso serie sea el subproceso de menor prioridad en el sistema o coloque algo en su código que le permita ceder el control de la CPU.(Por ejemplo, esperar en un semáforo cuando no hay caracteres disponibles, qué semáforo puede publicar desde una interrupción de datos disponibles). Cualquiera de los dos debería funcionar.

Otros consejos

UC / OS-II Soporta solo prioridades únicas.También necesita algo como Ostimadamente (x) o algún otro elemento en sus bucles de tarea para renunciar al controlador al programador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top