Red de conocimiento informático - Conocimiento informático - Módulo de gestión del temporizador

Módulo de gestión del temporizador

El temporizador es uno de los elementos básicos para el funcionamiento normal de los protocolos de comunicación. Se utiliza principalmente para diversas tareas de temporización y retransmisión de tramas. El protocolo de comunicación implementa el temporizador utilizado en el sistema de microcontrolador. La precisión del tiempo no es alta, pero la cantidad requerida es relativamente grande. Debido a los recursos de hardware limitados, es imposible asignar un temporizador de hardware a cada tarea individual. La única forma de satisfacer las necesidades de la aplicación de sincronización en el protocolo es simular múltiples temporizadores de software a través de un único temporizador de hardware.

Utilice ciertas estructuras de datos para organizar estos temporizadores de software y proporcionar una interfaz de llamadas unificada, lo que se denomina "administración de temporizadores". Actualmente, existen dos métodos de implementación principales para la gestión del temporizador:

①Método de matriz estática. Almacene los nodos del temporizador en una matriz. La ventaja es que la lógica es sencilla y ocupa menos ROM. Sin embargo, esta solución tiene desventajas obvias: cuando se produce una interrupción del temporizador de hardware, es necesario restar todos los nodos del temporizador, lo que lleva mucho tiempo y el retraso es incierto (relacionado con el número de temporizadores).

②Método de lista enlazada delta. Organícelos en orden ascendente según el valor del temporizador para formar una lista vinculada. El valor de tiempo del último temporizador es el valor de todos los temporizadores anteriores más el valor de este nodo. De esta manera, en cada procesamiento de interrupción de reloj, solo es necesario restar el primer nodo del temporizador, lo que reduce en gran medida la sobrecarga de tiempo. Sin embargo, esta solución tiene una lógica compleja, utiliza una gran cantidad de ROM, requiere una asignación y reciclaje de memoria frecuentes y provoca fácilmente la fragmentación de la memoria.

1 Diseño del módulo de gestión del temporizador

El diseño del módulo de gestión del temporizador se basa en el método de matriz estática. Utilice una matriz de nodos de temporizador para guardar todas las solicitudes de sincronización. Cada elemento de la matriz representa un nodo de temporizador disponible. Cada nodo del temporizador tiene un elemento de estado que indica que el temporizador está inactivo, usado o desbordado. El valor del temporizador y el mensaje que se enviará después de que expire el temporizador también se almacenan en el nodo del temporizador, lo que permite que un temporizador de hardware proporcione a los usuarios múltiples temporizadores de software.

Para resolver el problema de la alta sobrecarga de tiempo de procesamiento de interrupciones, se introduce un temporizador auxiliar en el módulo. El valor del temporizador auxiliar siempre es igual al valor de tiempo mínimo entre todos los nodos del temporizador. En el procesamiento de interrupciones del temporizador de hardware, solo se realiza la operación de resta en el temporizador auxiliar, lo que acorta en gran medida el tiempo de procesamiento de interrupciones. El principio de diseño se muestra en la Figura 1.

2 Implementación del módulo de gestión del temporizador

2.1 Estructura de datos e interfaz de función

Las estructuras de datos relevantes utilizadas por el módulo de gestión del temporizador se definen de la siguiente manera:

p>

El campo estado guarda el estado del nodo del temporizador, que puede estar inactivo (T_FREE), en uso (T_INUSE) o desbordado (T_OVERFLOW).

El recuento de campos almacena el valor de tiempo del nodo del temporizador y el valor máximo es 65 535. Si la interrupción del temporizador de hardware se establece en 10 ms, el tiempo máximo del temporizador de software es de aproximadamente 655 s, lo que puede satisfacer las necesidades de la mayoría de las aplicaciones.

El campo msg apunta al mensaje de usuario del temporizador. Al iniciar el cronómetro, en este campo se guarda el puntero al mensaje. Cuando expire el tiempo programado, el controlador de interrupciones enviará automáticamente este mensaje para notificar al usuario de la tarea.

Dado que el subíndice de la matriz es único, se puede utilizar como un número de identificación único para identificar el nodo. Todos los números de identificación de nodo que se mencionan a continuación representan el subíndice del nodo en la matriz.

MAX_TIMER_NUM indica el número máximo de temporizadores permitidos por el sistema y su valor depende de las necesidades específicas de la aplicación.

Las funciones clave de la interfaz proporcionadas por este módulo son las siguientes:

2.2 Inicialización del temporizador

Antes de utilizar el módulo de gestión del temporizador, es necesario inicializar el temporizador. El objetivo principal es inicializar la matriz de nodos del temporizador, configurar cada nodo del temporizador en estado inactivo y configurar el temporizador auxiliar en cero, y la ID auxiliar apunta a 0xFF (que indica vacío).

2.3 Iniciar un temporizador

Iniciar un temporizador principalmente pone en uso un nodo inactivo en la matriz de nodos. Si este temporizador recién habilitado tiene el valor de tiempo más pequeño entre todos los temporizadores, el temporizador auxiliar también se actualizará. La función toma el puntero al mensaje del temporizador y el valor del temporizador como parámetros, y el proceso de inicio del temporizador se muestra en la Figura 2. Una vez que el temporizador se inicia correctamente, se devuelve el número de identificación del nodo del temporizador.

2.4 Eliminación del temporizador

Antes de que expire el temporizador objetivo, el usuario puede solicitar cancelar el temporizador por algún motivo. Por ejemplo, si se utiliza el temporizador de retransmisión, el usuario inicia el temporizador después de enviar la trama de datos y espera a que la otra parte devuelva una trama de respuesta. Si no se recibe una trama de respuesta cuando expira el temporizador, el usuario debe reenviar la trama de datos original; si se recibe una trama de respuesta antes de que expire el temporizador, el usuario debe cancelar el temporizador inmediatamente y continuar con el siguiente proceso de comunicación.

La función de eliminación del temporizador toma el número de identificación del nodo del temporizador como parámetro de entrada, establece el nodo del temporizador en el estado inactivo y actualiza el temporizador auxiliar según sea necesario. El proceso se muestra en la Figura 3.

Controlador del temporizador 2.5

El controlador del temporizador de software lo proporciona el temporizador de hardware. En la interrupción del temporizador de hardware, primero disminuya el valor del temporizador auxiliar en 1. Si el valor del temporizador auxiliar es 0, significa que el temporizador con el valor de tiempo más pequeño ha agotado el tiempo de espera. El mensaje correspondiente debe enviarse a la tarea del usuario, el nodo debe configurarse en estado inactivo y los valores de tiempo de otros. Los nodos deben recalcularse y el valor de tiempo con el valor de tiempo más pequeño debe encontrarse al mismo tiempo que el nodo y actualiza el temporizador auxiliar.