2009-02-17 13 views
8

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!

+0

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

Respuesta

6

Lo que se está implementando aquí es esencialmente msleep_interruptible() (Linux/kernel/timer.c)

/** 
* msleep_interruptible - sleep waiting for signals 
* @msecs: Time in milliseconds to sleep for 
*/ 
unsigned long msleep_interruptible(unsigned int msecs) 

Esta función tiene la ventaja de que la especificación es en milisegundos y oculta los detalles de jiffies envolver internamente. Asegúrese de verificar los valores devueltos, ya que esta llamada devuelve el número de jiffies restantes. Cero significa que la llamada durmió durante el número especificado de milisegundos, mientras que un valor distinto de cero indica que la llamada se interrumpió en este momento.

Con respecto a la envoltura, ver la sección 6.2.1.2 para una descripción de jiffies y envoltura. Además, este post intenta describir el ajuste en abstracto.

+0

Si miro la fuente de msleep_interruptible, ¡parece notablemente similar! Todavía tendría que considerar el valor de retorno de esa función si entiendo correctamente, ya que el sueño interrumpible puede regresar antes de lo esperado ¿no? – Benjamin

+0

En cuanto a poner un tiempo de espera después de la marca MAX_JIFFY_OFFSET, ¿tiene alguna idea de si esto está bien? Veo que sucede mucho en las fuentes del kernel, pero esta es una cuestión más teórica sobre la que me estaba preguntando. ¡Gracias por tomarse el tiempo para responder hasta ahora! :) – Benjamin

Cuestiones relacionadas