versiones ultima descargar c linux-kernel

c - ultima - linux y sus versiones



Hora normal en Linux kernel 2.6 (1)

Lo que 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 está en milisegundos y oculta los detalles de los jiffies que se envuelven 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ó durante muchos jiffies antes de tiempo.

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

He leído el capítulo 7 en "Controladores de dispositivo Linux" (que se puede encontrar aquí) 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 CONFIG_HZ configurado en 1000).

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 actual de ''jiffies''. Ya he aprendido que hay funciones que tienen en cuenta el jiffy wrap de 32 bits, así que para comparar dos valores estoy usando esto:

if (time_after(jiffies, some_future_jiffies_value)) { // we''ve already passed the saved value }

Aquí viene mi pregunta: 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?

Actualizar:

Para evitar cosas con wraparound, he reescrito mi loop de sueño:

// Sleep for the appropriate time while (time_after(some_future_jiffies_value, jiffies)) { set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(1); }

Supongo que esto es más portátil ¿verdad?

Actualización 2:

Muchas gracias, ''ctuffli'' por tomarse el tiempo para volver a esta pregunta y proporcionar algunos comentarios sobre mis comentarios también. 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!