Red de conocimiento informático - Problemas con los teléfonos móviles - Explicación detallada de la cola de trabajo RT-Thread

Explicación detallada de la cola de trabajo RT-Thread

Antes de aprender, primero puede comprender los escenarios de uso de la cola de trabajo: cola de trabajo (cola de trabajo).

En resumen, la cola de trabajo retrasa la ejecución de algunas tareas de trabajo y las entrega al subproceso del núcleo para su ejecución asincrónica.

La forma más sencilla de usarlo es abrir la cola de trabajo del sistema de RT-Thread y podemos enviar el elemento de trabajo a la cola de trabajo del sistema.

RT-Thread en realidad nos proporciona un hilo de trabajo del sistema, pero pocas personas lo saben. La ruta de la opción de configuración se muestra en la siguiente figura:

Seleccione las opciones anteriores para abrir la cola de trabajo del sistema. También puede ver que el tamaño de pila del subproceso de la cola de trabajo tiene como valor predeterminado 2048 y la prioridad es 23.

De esta manera, el sistema crea una cola de trabajo del sistema durante la inicialización, llamada sys_work. Puede ver el hilo escribiendo ps en la terminal.

¿Cómo agregar elementos de trabajo al hilo de trabajo del sistema?

rt_work_submit() se usa para agregar elementos de trabajo a la cola de trabajos del sistema, y ​​rt_work_cancel() se usa para cancelar un elemento de trabajo de la cola de trabajos del sistema.

Por supuesto, al enviar un elemento de trabajo, debe inicializar el elemento de trabajo y vincular la función de devolución de llamada correspondiente y el puntero de usuario. La interfaz es la siguiente:

De esta manera, podemos enviarlo en cualquier momento y en cualquier lugar. Se realizan las tareas de trabajo, lo que facilita enormemente la organización del programa.

Utiliza una pequeña rutina para probarlo:

Ingresa en main.c en el proyecto qemu:

Luego ejecútalo y verás el siguiente efecto. La tarea vinculada al elemento de trabajo se ejecuta de forma asincrónica y la ejecución del elemento de trabajo 1 se retrasa 2 ticks.

Hay muchas interfaces para rt_workqueue, solo debemos centrarnos en las más utilizadas.

Primero use rt_workqueue_create() para crear una cola de trabajo, luego use rt_workqueue_submit_work() para enviar elementos de trabajo, use rt_workqueue_cancel_work() para cancelar elementos de trabajo y, por supuesto, use rt_workqueue_destroy() para destruir una cola de trabajo. Aquellos que estén interesados ​​pueden aprender sobre otras interfaces, pero las cuatro anteriores son las de uso común.

La única diferencia entre enviar tareas aquí y usar la cola de trabajo del sistema anterior es que debemos especificar manualmente la cola de trabajo. Todo lo demás es exactamente igual.

Utiliza una pequeña rutina para probarlo:

Ingresa en main.c en el proyecto qemu:

Luego ejecútalo y verás el siguiente efecto. La tarea vinculada al elemento de trabajo se ejecuta de forma asincrónica y la ejecución del elemento de trabajo 1 se retrasa 2 ticks.

Con respecto a la parte de implementación, no presentaré los detalles específicos aquí. Hice algunas animaciones para mostrarle el proceso interno.

Hay un hilo (hilo de trabajo) en la cola de trabajo. y la tarea de este hilo es extraer continuamente el elemento de trabajo de la lista de montaje (lista de trabajo) y ejecutarlo. Si no hay ningún elemento de trabajo, se suspenderá.

Luego, al enviar un elemento de trabajo, si el tiempo de retraso es mayor que 0, se iniciará el temporizador del elemento de trabajo y luego se agregará a la lista de montaje (lista de trabajo) una vez que expire el temporizador.

Si el retraso es realmente igual a 0 al enviar un elemento de trabajo, el elemento de trabajo se agregará directamente a la lista de montaje (lista de trabajo).

Por supuesto, después de que expire el temporizador del elemento de trabajo, el elemento de trabajo se agregará automáticamente a la lista de montaje (lista de trabajo).