SubRutinas - PowerPoint PPT Presentation

1 / 5
About This Presentation
Title:

SubRutinas

Description:

... que hace girar al robot en torno a su centro. La tarea main llama 3 veces a la subrutina turn_around. ... A veces esto se denomina 'contenci n de recursos. ... – PowerPoint PPT presentation

Number of Views:93
Avg rating:3.0/5.0
Slides: 6
Provided by: PPSa1
Category:
Tags: subrutinas | veces

less

Transcript and Presenter's Notes

Title: SubRutinas


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_AOUT_C) task main()
OnFwd(OUT_AOUT_C) Wait(100)
turn_around() Wait(200) turn_around()
Wait(100) turn_around() Off(OUT_AOUT_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
task main() SetSensor(SENSOR_1,SENSOR_TOUCH) st
art check_sensors start move_square
Usemos un ejemplo visto en la Lección de Tareas
task move_square() while (true)
OnFwd(OUT_AOUT_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_AOUT_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.
Write a Comment
User Comments (0)
About PowerShow.com