[Desarrollo de controladores Linux Embedded] Nueve, introducir el concepto de interrupción, comprender marco factor clave (notificación asíncrona detallada)

  La vida no puede esperar a que otros para organizar, para ellos mismos y para luchar lucha, sin importar el resultado es una tragedia, pero el consuelo es que siempre vive una pena en este mundo. Con este entendimiento, se valorar la vida, pero no cínica, sino que también daría la inyección en sí una poderosa fuerza interior.


A través de este conocimiento podemos entender las siguientes secciones:

① habilidades básicas de conducción: interrumpe, el sueño, se despiertan, los mecanismos de votación.

  • Estas habilidades básicas son el desarrollo cargo de los propios, otra gran complejo en coche es sus ideas de marco y diseño, pero la tecnología básica para estos.

② APP
desarrollo de habilidades básicas: el bloqueo, sin bloqueo, el sueño, encuesta, notificación asíncrona.

En primer lugar, el método clave de lectura

APP también es clave para leer los cuatro métodos:

  • ① consulta
  • ② sueño - el modo de alerta (sólo hacer esto una cosa)
  • ③ modo de sondeo
  • ④ método de notificación asíncrona

  2, 3, 4 métodos, implica la rutina de servicio de interrupción. Interrupción, como un niño se despertaba llorando, al igual que, sin darse cuenta interrumpió la llegada, que va a hacer ciertas cosas: Wake APP, la señal de APP. Por lo tanto, el controlador de llave, interrumpir el núcleo. De hecho, si las interrupciones son importantes en Linux en el SMC. En Linux, el conocimiento de interrupción también se refiere a procedimientos, hilos, y así sucesivamente.

①, consulta

UN
  de configuración del controlador, una estructura file_operations Registro, que proporciona una función correspondiente abierta, leer.
  Al llamar a la aplicación abierta, hace que la unidad para abrir la función correspondiente se llama, en el que GPIO configurado como un pin de entrada. Cuando APP leer llamada, hacer que la unidad para leer la función correspondiente se llama, se lee el registro, el estado del pin se devuelve directamente a la aplicación.

②, el sueño - el modo de despertador

Aquí Insertar imagen Descripción
  de configuración del controlador, una estructura file_operations Registro, que proporciona una función correspondiente abierta, leer.
  Al llamar a la aplicación abierta, hace que la unidad para abrir la función correspondiente se llama, en el que GPIO configurado como un pin de entrada; y registrado GPIO interrupción manejador . Cuando APP leer llamada, hacer que la unidad para leer la función correspondiente se llama, si los datos botón se devuelve directamente a APP; de lo contrario APP latente en modo de núcleo .
  Cuando el usuario pulsa una tecla, GPIO interrupción se activa, lo que lleva a la inscripción antes de ejecutar la rutina de servicio de interrupción del conductor. Se grabará un archivo de clave, y el sueño como consecuencia de APP. APP se despertó después de un funcionamiento continuo en modo de núcleo, es decir, código de controlador continúa, los datos se devuelven a la tecla de APP (espacio de usuario).

③, modo de sondeo

Aquí Insertar imagen Descripción
  Por encima del sueño - el modo de despertador tiene un inconveniente: si el usuario no ha teclas, a continuación, la aplicación va dormir para siempre. Podemos establecer un reloj despertador a APP, este es el modo de sondeo.

  de configuración del controlador, una estructura file_operations Registro, que proporciona un correspondiente abierto, Read, sondeo de función.
  Al llamar a la aplicación abierta, hace que la unidad para abrir la función correspondiente se llama, en el que GPIO configurado como un pin de entrada; y registrado GPIO interrupción manejador .
  APP llama a la encuesta o seleccionar las funciones, la intención es "investiga" si hay datos, estas dos funciones se pueden asignar un tiempo de espera, que no hay datos en este período de tiempo, entonces se devuelve un error . Esto hace que la función de sondeo de conducción correspondiente se llama, si los datos botón se devuelve directamente a APP, APP de otro modo inactivo durante algún tiempo en el modo de núcleo.
  Cuando el usuario pulsa una tecla, GPIO interrupción se activa, lo que lleva a la inscripción antes de ejecutar la rutina de servicio de interrupción del conductor. Se grabará un archivo de clave, y el sueño como consecuencia de APP. Si el usuario no presiona una tecla, pero el tiempo de espera se ha terminado, el núcleo se despertará APP.
  Así que hay dos tipos de APP estelas Causa: El usuario acciona el tiempo de espera de clave . Despertado APP continúe funcionando en modo de núcleo, es decir, código de controlador continúa, el "status" de nuevo a APP (espacio de usuario). APP para dar sondeo / seleccionar la función devuelve un resultado, si hay un reconocimiento de datos, y luego llamar a la función de lectura, lo que provoca conductor función de lectura que se llama, entonces los datos contenidos en el conductor, devolverá directamente los datos.

④, método de notificación asíncrona

Aquí Insertar imagen Descripción

  El principio es notificación asíncrona: APP señal al núcleo. Hay una variedad de señales, donde el pelo es el SIGIO (el tipo IO de señal).

  de configuración del controlador, una estructura file_operations Registro, que proporciona un correspondiente abierto, Read, fasync función.
  Al llamar a la aplicación abierta, hace que la unidad para abrir la función correspondiente se llama, en el que GPIO configurado como un pin de entrada; registro GPIO y manejador de interrupciones. APP para registrar su manejador de señales SIGIO: my_signal_fun.
  APP llamando a la función fcntl para marcar el conductor cambió FASYNC, que puede conducir a la función fasync conductor se llama, simplemente grabar PID de proceso.
  Cuando el usuario pulsa una tecla, GPIO interrupción se activa, lo que lleva a la inscripción antes de ejecutar la rutina de servicio de interrupción del conductor. Se registrará los datos clave, a continuación, envía la señal SIGIO al proceso PID.
  APP se interrumpirá después de la señal recibida, lleva a cabo el procesamiento de señal de las funciones de: la función de procesamiento de señal pueden ser una llamada a la función de lectura lee el valor de la clave.
  Después de las declaraciones de manejador de señales, APP continuará ejecutando código que previamente había sido interrumpido

Leer el resumen de la clave

  Nuestro método proporciona un factor clave para los anteriores cuatro tipos se puede lograr, pero el conductor no debe limitarse APP el método a utilizar.
  Este es un principio impulsado por el diseño: la capacidad de proporcionar y no proporciona la política . Es decir, que desea utilizar cualquiera de las filas método, el controlador puede proporcionar, pero el conductor no puede limitar el método a utilizar.

En segundo lugar, el ejemplo de una notificación asíncrona prueba, profundizar en la comprensión

signal.c

#include <stdio.h>
#include <unistd.h>
#include <signal.h>
void my_sig_func(int signo)
{
    printf("get a signal : %d\n", signo);
}

int main(int argc, char **argv)
{
    int i = 0;
    
    signal(SIGIO, my_sig_func);
    
    while (1) 
    {
        printf("Hello, world %d!\n", i++);
        sleep(2);
    }
    
    return 0;
}

Línea de programa función de procesamiento de señal de registro 13, una línea 15 es bucle infinito. Durante su funcionamiento, puede utilizar otra señal de APP a ella, para ver el efecto de notificación asíncrona.

  • ①, el programa se compila con gcc
gcc -o signal signal.c // 编译程序
  • ②, ejecute el programa
./signal

Se puede ver, ha sido impreso
Aquí Insertar imagen Descripción
y luego abrir un terminal, transmite una señal a la APP

  • ③, ver el ID de proceso de señal
  941 pts/2    00:00:00 signal

Muestro aquí es 941
Aquí Insertar imagen Descripción

  • ④, un terminal de señal de segunda transmisión
kill -SIGIO 941

Aquí Insertar imagen Descripción
Podemos ver que el primer terminal recibe la señal, y sigue funcionando.

Cuando nos protegemos signal.cen signal(SIGIO, my_sig_func);, otra vez envía una señal de lo que va a pasar? Presione ctrl + c para poner fin a la impresora terminal actual, ①②③④ repitiendo los pasos anteriores.

Aquí Insertar imagen Descripción

Se puede observar que, después de la señal de transmisión matar directamente a un primer terminal, la señal no se describe en esta notificación asíncrona tiempo.

Publicados 707 artículos originales · ganado elogios 1162 · Vistas de 820.000 +

Supongo que te gusta

Origin blog.csdn.net/ReCclay/article/details/105089817
Recomendado
Clasificación