50 likes | 199 Views
Sub R utin a s. S e 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 subrutin a s.
E N D
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 hasta8 subrutinas.
SubrutinaDe 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 subrutinaturn_around. sub turn_around() { OnRev(OUT_C);Wait(340); OnFwd(OUT_A+OUT_C); } task main() { OnFwd(OUT_A+OUT_C); Wait(100); turn_around(); Wait(200); turn_around(); Wait(100); turn_around(); Off(OUT_A+OUT_C); } Note que al invocar una subrutinanecesita 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.
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.
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 tareacheck_sensorsno detiene a la tareamove_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.
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, sicheck_sensorsno detiene a la otra tarea, ambas se alternarían atrás y adelante muy rápidamente. check_sensorspodrí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.