AYUDA CON RTOS

Ver el tema anterior Ver el tema siguiente Ir abajo

AYUDA CON RTOS

Mensaje por mantis el Sáb 8 Mayo 2010 - 22:10

Hola soy nuevo en el foro, y en el mundo de
los PIC y RTOS.
Mi pregunta es la siguiente:

En el entorno de makingthings hemos desarrollado unas prácticas para generar
mediante creación de tareas, semáforos y colas, una paliación para mover un
servomotor.

Mediante unos potenciómetros conseguíamos coger los valores de los mismos y
estos adjudicárselos a los parámetros que necesitaba una función para servos en
la que los parámetros eran la velocidad y posición en la que queríamos que
funcionase el servo.
Para ello utilizábamos unas tareas y estas a su vez utilizaban unas funciones.
TaskCreate( enviarValorPotenciometro,"mandarValorPotenciometro", 400, 0, 4 ); *el ultimo param es la prioridad
TaskCreate( recibirValorPotenciometro,"recibirValorPotenciometro", 400, 0, 3 ); *el ultimo param es la prioridad
TaskCreate( controlarLuzSemaforo, "controlarLuzSemaforo", 400,0, 5); *el ultimo param es la prioridad


Cada tarea tenia unas prioridades asociadas, y la función que llevaba a cabo la
tarea utilizaba semáforos y colas. Un ejemplo:

void controlarLuzSemaforo(void * parametros){
semaforo = SemaphoreCreate();
AnalogIn_SetActive(4,1);//Activar el sensor de luz
AppLed_SetActive(0,1);
while(1){
if(AnalogIn_GetValue(4) < 100){
SemaphoreTake(semaforo,0);
AppLed_SetState(0,1);
}
else{
SemaphoreGive(semaforo);
AppLed_SetState(0,0);
}
Sleep(10);
}
}


Mi pregunta es la siguiente, si cada tarea tiene una prioridad, como se ejecutaría
el programa, primero la tarea de mayor prioridad hasta la de menor prioridad, y
si así porque se le pone el "while(1)", porque cada una de las
funciones de cada tarea tiene un "while(1)" y si es así nunca se ejecutaría
la tarea de menor prioridad. Nunca saldria del bucle.

Espero que alguien me pueda ayudar con esta duda, Gracias de antemano.

mantis
Nuevo Usuario
Nuevo Usuario

Mensajes : 2
Fecha de inscripción : 08/05/2010

Volver arriba Ir abajo

Re: AYUDA CON RTOS

Mensaje por Pikitin el Lun 10 Mayo 2010 - 4:49

Que tal mantis?

No me ha quedado claro qué RTOS está usando, el funcionamiento puede variar bastante.

No sé gran cosa de RTOs, pero como ideas generales:

si cada tarea tiene una prioridad, como se ejecutaría
el programa,
primero la tarea de mayor prioridad hasta la de menor prioridad,

En principio es así, pero esto depende del RTOS, hay varios sistemas; en general hay un proceso que reparte el tiempo entre las distintas tareas según su prioridad y otros factores, por ejemplo podría haber tareas que tengan asignado un tiempo máximo de procesador o puede haber un tiempo máximo para cualquier tarea, o puede no haber tiempos máximos y cada tarea es la encargada de "entregar" el control cuando haya terminado de hacer sus cosas.

porque se le pone el "while(1)", porque cada una de las
funciones de
cada tarea tiene un "while(1)" y si es así nunca se ejecutaría
la
tarea de menor prioridad. Nunca saldria del bucle.

Tienes que pensar que aunque haya una bucle infinito la ejecución de la tarea podría ser interrumpida en cualquier momento para dar el control a otra tarea.
Ya te digo que esto puede variar mucho de un RTOS a otro, pero aunque las tareas no fueran interrumpibles el truco está en el sleep(10), este sleep significa ceder el procesador para que otras tareas puedan ejecutarse, osea la tarea "controlarluzsemáforo" ejecuta la primera parte del bucle, hace sus cáculos y actualiza sus valores,.. cuando llega al sleep(10) se pone en estado "inactiva" y cede el control al proceso que haga la gestion de tareas, este dá el control a la siguiente tarea en la cola según sus prioridades y demás, 10 unidades de tiempo despues "controlarluzsemáforo" se pondrá activa de nuevo y esperará en la cola a que le toque el turno, cuando reciba el procesador ejecutará de nuevo la primera parte del bucle y se volverá a poner inactiva por 10 unidades de tiempo...

Piensa que cuando escribes funciones del RTOS estas son de más alto nivel y que hay un proceso de fondo que es el que realmente llama a cada tarea cuando le toca el turno.
En este caso el sleep(10) es una especie de "return" , osea sale de la subrutina con el argumento 10, como esta subrutina fué llamada por el proceso "gestor" este recibe el 10 y le pone una marca a esta tarea: "no llamar a esta tarea hasta dentro de 10 ud. de tiempo", entonces lee las marcar de las otras tareas, si alguna ya está disponible le quita la marca que tubiera y le pone la marca "disponible" y la pone a la cola, luego da el control a la primera tarea de la cola.

Hay RTOS que tienen varias colas, una para cada prioridad y entonces se dá el control más veces a las cola de mayor prioridad, por ejemplo si hay 3 colas y la de mayor priorida es la 1, podría ir llamando tareas en este orden: cola1, cola2, cola1, cola3, cola1, cola2, cola1, cola2, cola1, cola3, cola1, cola2, cola1, cola3... o algo parecido, de manera que las tareas con mayor prioridad se ejecutan más frecuentemente.

Pero en esto hay varios sistemas y varían de un RTOS a otro.

Ya te digo que no conozco a fondo ningún RTOS, pero el principio general es más o menos así.


Saludos.

Pikitin
veterano
veterano

Mensajes : 623
Fecha de inscripción : 26/11/2008

http://linuxmicros.blogspot.com/

Volver arriba Ir abajo

Ver el tema anterior Ver el tema siguiente Volver arriba


 
Permisos de este foro:
No puedes responder a temas en este foro.