1 / 5

Sub R utin a s

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.

dooley
Télécharger la présentation

Sub R utin a s

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  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 hasta8 subrutinas.

  2. 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.

  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. 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.

  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, 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.

More Related