[Jderobot] Uso correcto de usleep y sleep en componentes
Roberto Calvo
rocapal en gsyc.urjc.es
Lun Dic 30 11:16:01 CET 2013
Hola,
Durante un tiempo nos ha venido mordiendo un bug bastante problemático
sobre el uso de las funciones usleep y sleep para dormir los
componentes.
Normalmente se hace el usleep del componente así:
usleep (this->cycle - (IceUtil::Time::now().toMicroSeconds() - last.toMicroSeconds()));
Toda la operación de dentro, rara vez y de muy de tarde en tarde puede
ser negativa si el componente se lleva más tiempo que el ciclo
configurado. La función usleep espera un unsigned int, por lo que la
conversión implícita hace que un entero (-1) se convierta en un entero
sin signo (4294967295). Eso son microsegundos, pasado a horas rondan la
hora y media, teniendo en cuenta que el resultado fue un -1.
Rara vez se suele dar este comportamiento si ejecutáis 5min el
componente, pero si lo dejáis mucho tiempo ejecutando o se ejecuta en
equipos menos pontentes (MK802) aparece finalmente y veréis bloqueado
vuestro componente.
La solución pasa por comprobar el valor antes de hacer el usleep
int delay = IceUtil::Time::now().toMicroSeconds() - lastIT.toMicroSeconds();
if (delay <1 || delay > cycle)
delay = 1;
usleep(delay);
El bug #145 detalle este problema y tenéis la solución en el primer
comentario. Por favor, echar un ojo a vuestros componentes y actualizar
si es necesario el código uniéndolo con el bug #145.
Un saludo!
[1] http://redmine.jderobot.org/issues/145
--
Roberto Calvo Palomino | Robotics Lab (GSyC)
R&D Android Mobile Engineer | Universidad Rey Juan Carlos
Twitter: @rocapal
Linkedin: http://www.linkedin.com/in/rocapal
More information about the Jde-developers
mailing list