martes, 11 de octubre de 2011

Multitareas


Luego de realizar un gran lista de actividades el primer semestre, logramos, ahora, entrar en un área de un nivel mas avanzado, en comparación a todas las anteriores. Algunas de las funciones nuevas que implementamos en este trabajo fueron: ExitTo, Precedes, Mutex, Acquire, Release. Luego de varias clases comenzamos a entender, en que situaciones aplicar lo aprendido, ya que si estas funciones eran ejecutadas de mala manera, podrían traer consecuencias para la realización del código. En el siguiente trabajo se plantea un problema y se busca con este, que nosotros apliquemos las funciones aprendidas de manera óptima, para que el código resulte mas limpio y solido al momento de su ejecución. La actividad consistía en una competencia, en donde el robot debe encontrar la mayor cantidad de puntaje, sin chocar con los obstáculos puestos en la pista.  En el caso de que el robot chocara con algún tipo de obstáculo, la actividad llegaría a su fin.


Pseudo Código:

SubTarea Tono () {

Mientras(verdadero) {

    TocaMelodia(262,400); Espera(0,5 seg);
    TocaMelodia(294,400); Espera(0,5 seg);
    TocaMelodia(330,400); Espera(0,5 seg);
    TocaMelodia(294,400); Espera(0,5 seg);
    TocaMelodia(262,1600); Espera(2seg);
    }
}

SubTarea Choque(){

Mientras(verdadero) {
   

    Si(SensorTacto!=0){
   
            Salir de TONO;
            Parar Motores;
            Esperar(60Seg);
             
            }
    Avanzar(potencia= 20);
   
    Si(SensorAudio>Decibel=90){
            Retrocede(Potencia);
            Espera(0,5Seg);
            Gira 90º(Izquierda);

             }
    }




SubTarea Circulo(){

variable timer= Tiempo actual;

Mientras(verdadero){

    Si(SensorLuz<Umbral 40){

             Contador++;
             Variable t= Tiempo actual;
             t= (timer-t)/1000;
             TocaMelodia(500,300);
             Esperar(1Seg);
             
             Si(t<=10){

                         Variable Puntos[100];
                         Puntos[i]=(-5*t)+50;
                         
                         Imprime(posX 5,PosY 5,"puntos"puntos[i];                   
                         }
             
             Si no {

                         Puntos[i]=Puntos[i]+0;
                         }
             Espera(0,1Seg);
             Si (potencia<=90){

                         Potencia=Potencia+10;    
   
                         }           
             }

    }

}





Código Fuente:

//autor grupo terabytes
//viernes
 #define UMBRAL 40
 #define DECIBEL 90

 int puntos[100];
 int timer=0;
 int TotalTiempo;
 int t=0;
 int i=0;
 int potencia=20;

 task Tono (){
 while(true){
            PlayToneEx(262,400,9,0); Wait(500);
            PlayToneEx(294,400,9,0); Wait(500);
            PlayToneEx(330,400,9,0); Wait(500);
            PlayToneEx(294,400,9,0); Wait(500);
            PlayToneEx(262,1600,9,0); Wait(2000);


                        }
            }

 task Choque () {
            while(true) {
                        if(Sensor(IN_1)!=0){

                                   Off(OUT_AB);
                                   Wait(60000);
                                   ExitTo(Tono);
                                   }
                        OnFwd(OUT_AB,potencia);
                        if(Sensor(IN_3)>DECIBEL){
                                   OnRev(OUT_AB,50);
                                   Wait(500);
                                   OnFwd(OUT_B,30);
                                   Wait(570);
}           }           }
 task Circulo (){
 timer=CurrentTick();
                        while(true){

                        if(Sensor(IN_2)<UMBRAL){
                        i++;     
                        t=CurrentTick();
                        t=(timer-t)/1000;
                        PlayTone(500,300);
                        Wait(1000);

                        if(t<=10){
                                   puntos[i]=(-5*t)+50;

                                   NumOut(5,5,puntos[i]);
                                   }
                        else puntos[i]=puntos[i]+0;
                                   Wait(100);
                                   if(potencia<=100){
                                   potencia=potencia+10;}
                        }
                        }
                        }



 task main () {

            Precedes(Choque,Tono,Circulo);

                         
                         
   SetSensorLight(IN_2);
   SetSensorSound(IN_3);
   SetSensorTouch(IN_1);
 }


 Video Actividad



Conclucion.
En esta primera actividad del segundo semestre se ha de notar el nivel de complejidad mucho mas avanzada, siendo la evolucion totalmende escaladora de menor a mayor complejidad.
La implementacion de multitareas hace que se puedan ejecutar diferentes tareas al mismo tiempo no afectando una a la otra.

No hay comentarios:

Publicar un comentario