He leído el capítulo 7 en los 'Controladores de dispositivo Linux' (which can be found here) que el tiempo se puede medir en 'jiffies'. El problema con la variable stock jiffies es que se envuelve con bastante frecuencia (especialmente si tiene configurado su CONFIG_HZ en 1000).Cronometraje en el núcleo de Linux 2.6
En mi módulo kernel estoy guardando un valor de jiffies que está configurado en algún momento en el futuro y lo comparo en un momento posterior con el valor 'jiffies' actual. He aprendido ya que hay funciones que se llevan a la envoltura 32 bits santiamén en cuenta para comparar dos valores que estoy usando esto:
if (time_after(jiffies, some_future_jiffies_value))
{
// we've already passed the saved value
}
Aquí viene mi pregunta: ¿Así que ahora quiero establecer el 'some_future_jiffies_value' a "ahora + 10ms". Esto se puede lograr fácilmente al hacer esto:
some_future_jiffies_value = jiffies + msecs_to_jiffies(10);
¿Es esto correcto? ¿Qué sucede si los jiffies actuales están cerca de MAX_JIFFY_OFFSET y el valor resultante de msecs_to_jiffies (10) pone some_future_jiffies_value más allá de ese desplazamiento? ¿Se ajusta automáticamente o debo agregar algún código para verificar esto? ¿Hay funciones que me salvan de tener que lidiar con esto?
Actualización:
Para evitar cosas con envolvente he reescrito mi lazo del sueño:
// Sleep for the appropriate time
while (time_after(some_future_jiffies_value, jiffies))
{
set_current_state(TASK_INTERRUPTIBLE);
schedule_timeout(1);
}
Asumo que esto es más adecuado portátil?
Actualización 2:
Muchas gracias 'ctuffli' por tomarse el tiempo para volver a esta pregunta y proporcionar alguna información sobre mis comentarios así. Mi controlador kernel está funcionando bien ahora y es mucho menos feo en comparación con la situación antes de que me proporcionara todos estos consejos. ¡Gracias!
Otra idea: ¿usar get \ _jiffies \ _64() me salvaría de tener que pensar en el envolvente y simplemente me dejaría hacer cálculos simples? – Benjamin