La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

SubRutinas Se pueden usar subrutinas cuando se necesita el mismo trozo de código en distintos lugares del programa. En esos casos se escribe una subrutina.

Presentaciones similares


Presentación del tema: "SubRutinas Se pueden usar subrutinas cuando se necesita el mismo trozo de código en distintos lugares del programa. En esos casos se escribe una subrutina."— Transcripción de la presentación:

1 SubRutinas Se pueden usar subrutinas cuando se necesita el mismo trozo de código en distintos lugares del programa. En esos casos se escribe una subrutina y se le dá un nombre. Es posible ejecutar la subrutina, invocando el nombre desde la tarea. NQC permite hasta 8 subrutinas.

2 Subrutina De Ejemplo En este programa hemos definido una subrutina que hace girar al robot en torno a su centro. La tarea main llama 3 veces a la subrutina turn_around. sub turn_around() { OnRev(OUT_C);Wait(340); OnFwd(OUT_A+OUT_C); } task main() Wait(100); turn_around(); Wait(200); Off(OUT_A+OUT_C); Note que al invocar una subrutina necesita incluir el paréntesis de cierre. Se vé como otros comandos, pero no hay parámetros, asi que no se coloca nada entre paréntesis.

3 Advertencias Respecto a SubRutinas
Las subrutinas no pueden invocarse desde otras subrutinas. Las subrutinas pueden invocarse desde distintas tareas pero esto no es buena idea. Conduce a problemas pues la misma subrutina podría ejecutarse al mismo tiempo por dos tareas distintas. Esto podría llevar a una tarea a invocar la misma subrutina e intentar suar el mismo recurso, un motor o un sensor. A veces esto se denomina "contención de recursos.” Esto mismo es válido para el uso de variables globales.

4 Usemos un ejemplo visto en la Lección de Tareas
task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); start check_sensors; start move_square; } Usemos un ejemplo visto en la Lección de Tareas task move_square() { while (true) OnFwd(OUT_A+OUT_C); Wait(100); OnRev(OUT_C); Wait(85); } ¿qué ocurriría si la tarea check_sensors no detiene a la tarea move_square? task check_sensors() { while (true) if (SENSOR_1 == 1) stop move_square; OnRev(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A); Wait(85); start move_square; } Ambas tareas accesarían a los motores, ambas pelearían por el control.

5 Ambas tareas accesarían a los motores, ambas pelearían por el control.
Las tareas en realidad no corren al mismo tiempo (eso es imposible pues solo hay un procesador). Además, cada tarea tiene un pequeño tiempo para ejecutarse, y después el control pasa a la siguiente tarea, la cual corre por un breve tiempo, y asi. Luego, si check_sensors no detiene a la otra tarea, ambas se alternarían atrás y adelante muy rápidamente. check_sensors podría colocar los motores en reversa, y al regresar el control a move_square, los movería hacia adelante. Tal vez el robot se movería atrás y adelante y giraría, aleatoriamente y no haría lo correcto Esta misma situación es la que podría ocurrir si se permite a dos tareas llamar a la misma subrutina.


Descargar ppt "SubRutinas Se pueden usar subrutinas cuando se necesita el mismo trozo de código en distintos lugares del programa. En esos casos se escribe una subrutina."

Presentaciones similares


Anuncios Google