Toda la verdad sobre RTOS. Artículo # 28. Temporizadores de software

La idea de los temporizadores de software se introdujo en un artículo anterior . Son objetos del núcleo que proporcionan tareas con una forma simple de desencadenar eventos a tiempo o, más a menudo, una forma de realizar acciones de forma regular. Todos los detalles de la funcionalidad relacionada con el tiempo (precisión, manejo de interrupciones, etc.) en Nucleus SE se discutieron en un artículo anterior .



Artículos anteriores de la serie:
Artículo # 27. Hora del sistema
Artículo # 26. Canales: servicios auxiliares y estructuras de datos.
Artículo # 25. Canales de datos: introducción y servicios básicos
Artículo # 24. Colas: servicios auxiliares y estructuras de datos.
Artículo 23. Colas: introducción y servicios básicos.
Artículo # 22. Buzones: servicios auxiliares y estructuras de datos
Artículo # 21. Buzones: Introducción y servicios básicos
Artículo # 20. Semáforos: servicios auxiliares y estructuras de datos
Artículo # 19. Semáforos: introducción y servicios básicos.
Artículo # 18. Grupos de banderas de eventos: servicios auxiliares y estructuras de datos
Artículo # 17. Grupos de banderas de eventos: Introducción y servicios básicos
Artículo # 16. Señales
Artículo # 15. Particiones de memoria: servicios y estructuras de datos
Artículo # 14. Secciones de memoria: introducción y servicios básicos.
Artículo 13. Estructuras de datos de tareas y llamadas de API no compatibles
Artículo # 12. Servicios para trabajar con tareas.
Artículo # 11. Tareas: configuración e introducción a la API
Artículo # 10. Programador: funciones avanzadas y preservación del contexto
Artículo # 9. Programador: implementación
Artículo # 8. Nucleus SE: diseño interno y despliegue
Artículo # 7. Núcleo SE: Introducción
Artículo # 6. Otros servicios RTOS
Artículo # 5. Interacción de tareas y sincronización
Artículo # 4. Tareas, cambio de contexto e interrupciones
Artículo # 3. Tareas y planificación
Artículo # 2. RTOS: estructura y modo en tiempo real
Artículo # 1. RTOS: introducción.

Usando temporizadores


Los temporizadores del programa se pueden configurar para que se activen una vez, es decir, comienzan y luego, después de un período de tiempo específico, simplemente finalizan el ciclo. O el temporizador se puede configurar para reiniciar: después de que se complete el conteo, el temporizador se reinicia automáticamente. El tiempo de funcionamiento después de un reinicio puede diferir del tiempo de funcionamiento inicial. Además, el temporizador puede configurarse opcionalmente para realizar una función de terminación especial, que se ejecuta cuando (o cada vez) el temporizador completa el ciclo de trabajo.

Configuraciones de temporizador


Número de temporizadores


Como con la mayoría de los aspectos de Nucleus SE, la configuración del temporizador está controlada por las directivas #define en nuse_config.h . El parámetro principal es NUSE_TIMER_NUMBER , que define los temporizadores configurados en la aplicación. De forma predeterminada, este valor es cero (es decir, los temporizadores no se usan en la aplicación) y puede tomar valores de hasta 16. Un valor incorrecto generará un error de compilación, que se generará al registrar el archivo nuse_config_check.h (este archivo se incluye en nuse_config.c y compila junto con él), que activará la directiva #error .

Seleccionar un valor distinto de cero es el activador del temporizador principal. Este parámetro se utiliza al definir estructuras de datos y su tamaño depende de su valor. Además, un valor distinto de cero activa la configuración de la API.

Activación de la función de finalización.


En Nucleus SE, traté de encontrar la oportunidad de hacer que la funcionalidad sea opcional, donde ahorrará memoria. Un buen ejemplo es el soporte para las funciones de finalización del temporizador. Además del hecho de que esta característica es opcional para cada temporizador, el mecanismo se puede activar (o no) para toda la aplicación utilizando el parámetro NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT en nuse_config.h . Establecer este parámetro en FALSE bloquea la definición de dos estructuras de datos en la ROM, que se describirá en detalle en este artículo.

Activación API


Cada función API (llamada de utilidad) en Nucleus SE tiene una directiva activadora #define en nuse_config.h. Para los temporizadores, estos símbolos incluyen:
NUSE_TIMER_CONTROL
NUSE_TIMER_GET_REMAINING
NUSE_TIMER_RESET
NUSE_TIMER_INFORMATION
NUSE_TIMER_COUNT

De manera predeterminada, todos los activadores están configurados en FALSO , por lo que todas las llamadas de servicio están deshabilitadas, lo que bloquea la inclusión de código que las implementa. Para configurar temporizadores en la aplicación, debe seleccionar las llamadas de servicio API necesarias y configurarlas en VERDADERO .

El siguiente es un fragmento de código del archivo predeterminado nuse_config.h .

#define NUSE_TIMER_NUMBER 0/*      0-16 */ /*    */ #define NUSE_TIMER_CONTROL FALSE #define NUSE_TIMER_GET_REMAINING FALSE #define NUSE_TIMER_RESET FALSE #define NUSE_TIMER_INFORMATION FALSE #define NUSE_TIMER_COUNT FALSE 

Si la función API relacionada con el temporizador está activada y no hay temporizadores configurados en la aplicación (a excepción de la función NUSE_Timer_Count () , que siempre está habilitada), se producirá un error de compilación. Si su código usa una llamada API que no ha sido activada, se producirá un error de diseño porque el código de implementación no se incluyó en la aplicación.

Timer Service Calls


Nucleus RTOS admite ocho llamadas de utilidad relacionadas con el temporizador que proporcionan la siguiente funcionalidad:

  • Gestión (inicio / parada) temporizador. Nucleus SE se implementa en la función NUSE_Timer_Control () .
  • Recuperando el tiempo restante del temporizador. En Nucleus SE, implementado en NUSE_Timer_Get_Remaining () .
  • Restaurar el temporizador a su estado original (restablecer). Nucleus SE implementado en NUSE_Timer_Reset () .
  • Proporcionar información sobre un temporizador específico. Nucleus SE se implementa en NUSE_Timer_Information () .
  • Devuelve el número de temporizadores configurados (actualmente) en la aplicación. Nucleus SE se implementa en NUSE_Timer_Count () .
  • Agregar un nuevo temporizador a la aplicación (creación). Nucleus SE no está implementado.
  • Eliminar un temporizador de la aplicación. Nucleus SE no está implementado.
  • Devolver punteros a todos los temporizadores de la aplicación. Nucleus SE no está implementado.

La implementación de cada llamada de servicio se discutirá en detalle a continuación.

Servicios de temporizador


Las operaciones fundamentales que se pueden realizar con un temporizador son el control (inicio y parada) y la lectura del valor actual. Nucleus RTOS y Nucleus SE proporcionan dos llamadas de utilidad API básicas para estas operaciones.

Control del temporizador


Una llamada de utilidad a la API Nucleus RTOS para controlar el temporizador le permite activar y desactivar el temporizador (iniciar y detener). Nucleus SE ofrece una funcionalidad similar.

Desafío de control del temporizador en Nucleus RTOS
Prototipo de llamada de servicio:

ESTADO NU_Control_Timer (NU_TIMER * timer, OPTION enable);

Parámetros:
timer - puntero al bloque de control del timer provisto por el usuario;
enable es la función requerida; puede tomar los valores NU_ENABLE_TIMER o NU_DISABLE_TIMER .

Valor de retorno:
NU_SUCCESS : la llamada se completó correctamente;
NU_INAVLID_TIMER : puntero de temporizador no válido;
NU_INAVLID_ENABLE : función no válida.

Desafío de control del temporizador en Nucleus SE
Esta llamada a la API admite la funcionalidad completa de la API Nucleus RTOS.

Prototipo de llamada de servicio:
ESTADO NUSE_Timer_Control (NUSE_TIMER timer, OPTION enable);

Parámetros:
timer - índice (ID) del temporizador utilizado;
enable es la función requerida; puede tomar los valores NUSE_ENABLE_TIMER o NUSE_DISABLE_TIMER .

Valor de retorno:
NUSE_SUCCESS : la llamada se completó correctamente;
NUSE_INCALID_TIMER : índice de temporizador no válido;
NUSE_INVALID_ENABLE es una función no válida.

Implementar la gestión del temporizador en Nucleus SE
El código de función API NUSE_Timer_Control () (después de verificar los parámetros) es bastante simple:

 NUSE_CS_Enter(); if (enable == NUSE_ENABLE_TIMER) { NUSE_Timer_Status[timer] = TRUE; if (NUSE_Timer_Expirations_Counter[timer] == 0) { NUSE_Timer_Value[timer] = NUSE_Timer_Initial_Time[timer]; } else { NUSE_Timer_Value[timer] = NUSE_Timer_Reschedule_Time[timer]; } } else /* enable == NUSE_DISABLE_TIMER */ { NUSE_Timer_Status[timer] = FALSE; } NUSE_CS_Exit(); 

Si se especificó la función NUSE_DISABLE_TIMER , el estado del temporizador (parámetro NUSE_Timer_Status [] ) se establece en FALSE , que ignora el temporizador mediante el controlador de interrupciones.

Al seleccionar la función NUSE_ENABLE_TIMER, el contador del temporizador ( NUSE_Timer_Value [] ) se establece en NUSE_Timer_initial_Time [] , siempre que el temporizador nunca se haya detenido desde el último reinicio. De lo contrario, se le asigna el valor NUSE_Timer_Reschedule_Time [] . Luego, el estado del temporizador (parámetro NUSE_Timer_Status [] ) se establece en TRUE , lo que hace que el controlador de interrupciones procese el temporizador.

Lectura del temporizador


Para obtener el tiempo restante del temporizador, la llamada de servicio API Nucleus RTOS devuelve el número de medidas hasta que caduque. Nucleus SE ofrece una funcionalidad similar.

Llame para obtener el tiempo restante en Nucleus RTOS

Prototipo de llamada de servicio:
ESTADO NU_Get_Remaining_Time (NU_TIMER * timer, UNSIGNED * restantes_time);

Parámetros:
timer - puntero al bloque de control del timer provisto por el usuario;
restantes_tiempo : un puntero al almacenamiento del valor de tiempo restante, que es una variable de tipo SIN FIRMAR .

Valor de retorno
NU_SUCCESS : la llamada se completó correctamente;
NU_INVALID_TIMER : puntero del temporizador no válido.

Llame para obtener el tiempo restante en Nucleus SE
Esta llamada a la API admite la funcionalidad completa de la API Nucleus RTOS.

Prototipo de llamada de servicio:
ESTADO NUSE_Timer_Get_Remaining (NUSE_TIMER timer, U16 * restante_tiempo);

Parámetros:
timer - índice (ID) del temporizador utilizado;
restantes_tiempo : un puntero al almacenamiento del valor de tiempo restante, que es una variable de tipo U16 .

Valor de retorno:
NUSE_SUCCESS : la llamada se completó correctamente;
NUSE_INVALID_TIMER : índice de temporizador no válido;
NUSE_INVALID_POINTER : puntero nulo al tiempo restante ( NULL ).

Implementación de una lectura de temporizador en Nucleus SE
La variante del código de función API NUSE_Timer_Get_Remaining () (después de verificar los parámetros) es trivialmente simple. Se obtiene el valor NUSE_Timer_Value [] y luego se devuelve en la sección crítica.

Servicios de temporizador auxiliar


Nucleus RTOS tiene cuatro llamadas API que proporcionan funciones auxiliares relacionadas con los temporizadores: restablecer un temporizador, obtener información del temporizador, obtener el número de temporizadores en una aplicación y obtener punteros para todos los temporizadores en una aplicación. Las primeras tres funciones se implementan en Nucleus SE.

Reinicio del temporizador


Esta llamada a la API restablece el temporizador a su estado original no utilizado. El temporizador se puede activar o desactivar después del final de esta llamada. Solo se puede usar después de que el temporizador se haya deshabilitado (usando NUSE_Timer_Control () ). La próxima vez que se active el temporizador, se inicializará con el parámetro NUSE_Timer_Initial_Time [] . Nucleus RTOS le permite proporcionar un nuevo estado inicial y reprogramar el tiempo, así como especificar la función de finalización cuando se reinicia el temporizador. En Nucleus SE, estos valores se establecen durante la configuración y no se pueden cambiar ya que están almacenados en la ROM.

Llame para restablecer un temporizador en Nucleus RTOS

Prototipo de llamada de servicio:
ESTADO NU_Reset_Timer (NU_TIMER * timer, VOID (* expiration_routine) (UNSIGNED), UNSIGNED initial_time, UNSIGNED reschedule_time, OPTION enable);

Parámetros:
temporizador : un puntero a un temporizador reiniciable;
expiration_routine : indica la función que se ejecutará cuando finalice el ciclo;
initial_time : el número inicial de temporizadores hasta que finalice el ciclo;
reschedule_time : el número de tics del temporizador hasta que se completen el segundo ciclo y los posteriores;
enable : el estado requerido del temporizador después de un reinicio puede tomar los valores NU_ENABLE_TIMER o NU_DISABLE_TIMER .

Valor de retorno:
NU_SUCCESS : la llamada se completó correctamente;
NU_INVALID_TIMER : puntero no válido a la unidad de control del temporizador;
NU_INVALID_FUNCTION : puntero nulo a la función de finalización ( NULL );
NU_INVALID_ENABLE : el estado especificado es incorrecto;
NU_NOT_DISABLED : el temporizador ya se está ejecutando (debe detenerse antes de llamar a esta función).

Llame para restablecer el temporizador en Nucleus SE
Esta llamada de servicio API admite una versión simplificada de la funcionalidad principal de la API Nucleus RTOS.

Prototipo de llamada de servicio:
ESTADO NUSE_Timer_Reset (NUSE_TIMER timer, OPTION enable);

Parámetros:
timer - índice (ID) del temporizador de reinicio;
enable : el estado requerido después del restablecimiento puede tomar los valores NUSE_ENABLE_TIMER o NUSE_DISABLE_TIMER .

Valor de retorno:
NUSE_SUCCESS : la llamada se completó correctamente;
NUSE_INVALID_TIMER : índice de temporizador no válido;
NUSE_INVALID_ENABLE : el estado especificado es incorrecto;
NUSE_NOT_DISABLED : el temporizador ya se está ejecutando (debe detenerse antes de llamar a esta función).

Implementación de un reinicio del temporizador en Nucleus SE
La versión del código de función API NUSE_Timer_Reset () (después de verificar los parámetros y el estado actual) es bastante simple:

 NUSE_CS_Enter(); NUSE_Init_Timer(timer); if (enable == NUSE_ENABLE_TIMER) { NUSE_Timer_Status[timer] = TRUE; } /*  enable == NUSE_DISABLE_TIMER    FALSE */ NUSE_CS_Exit(); 

Una llamada a NUSE_Init_Timer () inicializa el valor del tiempo y borra el contador de finalización. Después de eso, si es necesario, se verifica el valor del estado requerido y si el temporizador está activado.

Información del temporizador


Esta llamada de servicio le permite obtener un conjunto de información del temporizador. La implementación de Nucleus SE difiere de Nucleus RTOS en que devuelve menos información ya que no se admite la denominación de objetos.

Llame para obtener información del temporizador en Nucleus RTOS

Prototipo de llamada de servicio:
ESTADO NU_Timer_Information (NU_TIMER * timer, CHAR * name, OPTION * enable, UNSIGNED * expirations, UNSIGNED * id, UNSIGNED * initial_time, UNSIGNED * reschedule_time);

Parámetros:
temporizador : un puntero a un temporizador sobre el que se solicita información;
nombre : puntero a la región de 8 caracteres para el nombre del temporizador;
enable : apunta a una variable que toma el estado actual del activador del temporizador: NU_ENABLE_TIMER o NU_DISABLE_TIMER ;
vencimientos : un puntero a una variable que toma un contador del número de finalizaciones del ciclo del temporizador desde su último reinicio;
id : puntero a una variable que toma el valor del parámetro pasado a la función de finalización del ciclo del temporizador;
initial_time : un puntero a una variable que toma un valor en el que se inicializará el temporizador después de un reinicio;
reschedule_time : un puntero a una variable que toma un valor en el que se inicializará el temporizador una vez completado.

Valor de retorno:
NU_SUCCESS : la llamada se completó correctamente;
NU_INVALID_TIMER : puntero del temporizador no válido.

Llame para obtener información del temporizador en Nucleus SE
Esta llamada a la API admite la funcionalidad principal de la API Nucleus RTOS.

Prototipo de llamada de servicio:
ESTADO NUSE_Timer_Information (NUSE_TIMER timer, OPTION * enable, U8 * expirations, U8 * id, U16 * initial_time, U16 * reschedule_time);

Parámetros:
timer - índice del temporizador sobre el que se solicita información;
enable : un puntero a una variable que toma el valor VERDADERO o FALSO , dependiendo de si el temporizador está activado o no;
vencimientos : un puntero a una variable de tipo U8 que toma el valor del número de finalizaciones del temporizador desde su último reinicio;
id : apunta a una variable de tipo U8 que toma el valor del parámetro pasado a la función de finalización del temporizador (devolverá un valor vacío si las funciones de finalización están desactivadas);
initial_time : un puntero a una variable de tipo U16 que toma un valor por el cual el temporizador se inicializará después de un reinicio;
reschedule_time : un puntero a una variable de tipo U16 , que toma el valor por el cual el temporizador se inicializará una vez completado.

Valor de retorno:
NUSE_SUCCESS : la llamada se completó correctamente;
NUSE_INVALID_TIMER : índice de temporizador no válido;
NUSE_INVALID_POINTER : uno o más parámetros de puntero son incorrectos.

Implementación de información del temporizador en Nucleus SE
Implementar esta llamada a la API es bastante simple:

 NUSE_CS_Enter(); if (NUSE_Timer_Status[timer]) { *enable = NUSE_ENABLE_TIMER; } else { *enable = NUSE_DISABLE_TIMER; } *expirations = NUSE_Timer_Expirations_Counter[timer]; #if NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT *id = NUSE_Timer_Expiration_Routine_Parameter[timer]; #endif *initial_time = NUSE_Timer_Initial_Time[timer]; *reschedule_time = NUSE_Timer_Reschedule_Time[timer]; NUSE_CS_Exit(); 

La función devuelve el estado del temporizador. El valor del parámetro de la función de terminación se devuelve solo si su soporte se ha activado en la aplicación.

Obtener el número de temporizadores


Esta llamada de utilidad devuelve el número de temporizadores configurados en la aplicación. En Nucleus RTOS, este valor puede cambiar con el tiempo y el valor de retorno mostrará el número actual de temporizadores. En Nucleus SE, el valor de retorno se establece durante la fase de ensamblaje y no se puede cambiar.

Llame para obtener un contador de temporizador en Nucleus RTOS

Prototipo de llamada de servicio:
SIN FIRMAR NU_Establecido_Timers (ANULADO);

Parámetros: ninguno

Valor de retorno: el número de temporizadores creados en el sistema.

Llamar al contador del temporizador en Nucleus SE
Esta llamada a la API admite la funcionalidad principal de la API Nucleus RTOS.

Prototipo de llamada de servicio:
U8 NUSE_Timer_Count (nulo);

Parámetros: ninguno

Valor de retorno:
la cantidad de temporizadores configurados en la aplicación

Implementación de contador de temporizador


La implementación de esta llamada a la API es bastante simple: se devuelve el valor del símbolo #define NUSE_TIMER_NUMBER .

Estructuras de datos


Los temporizadores usan cinco o siete estructuras de datos (ubicadas en RAM o ROM) que (como otros objetos de Nucleus SE) son un conjunto de tablas cuyo tamaño y número corresponde al número de temporizadores configurados y parámetros seleccionados.

Recomiendo encarecidamente que el código de la aplicación no utilice el acceso directo a estas estructuras de datos, sino que se refiera a ellas a través de las funciones API proporcionadas. Esto evitará la incompatibilidad con futuras versiones de Nucleus SE y los efectos secundarios no deseados, además de simplificar la transferencia de aplicaciones a Nucleus RTOS. La siguiente es una descripción detallada de las estructuras para simplificar la comprensión de la llamada de servicio y el código de depuración.

Datos de RAM


Estos datos tienen la siguiente estructura:
NUSE_Timer_Status [] es una matriz de tipo U8 que tiene una entrada para cada temporizador configurado y almacena el estado del temporizador (en ejecución o detenido: VERDADERO o FALSO ).
NUSE_Timer_Value [] es una matriz de tipo U16 que tiene una entrada para cada temporizador configurado y almacena el valor actual del contador del temporizador.
NUSE_Timer_Expirations_Counter [] : una matriz de tipo U8 , que contiene un contador del número de casos en que los temporizadores llegaron al final del ciclo desde su último reinicio.

Todas estas estructuras de datos se inicializan mediante la función NUSE_Init_Timer () cuando se inicia Nucleus SE. Uno de los siguientes artículos contendrá una descripción completa de los procedimientos de inicio de Nucleus SE.

Las siguientes son las definiciones de estas estructuras de datos en el archivo nuse_init.c :
RAM U8 Timer_Status [NUSE_TIMER_NUMBER];
RAM U16 NUSE_Timer_Value [NUSE_TIMER_NUMBER];
RAM U8 NUSE_Timer_Expirations_Counter [NUSE_TIMER_NUMBER];

Datos ROM


La estructura de estos datos:
NUSE_Timer_Initial_Time [] es una matriz de tipo U16 que tiene una entrada para cada temporizador configurado y almacena el valor de cada temporizador.
NUSE_Timer_Reschedule_Time [] : una matriz de tipo U16 que tiene una entrada para cada temporizador configurado y almacena el valor en el que se configurará el temporizador después de la finalización. Un valor de cero indica que el temporizador es "único" y no debe reiniciarse automáticamente.
NUSE_Timer_Expiration_Routine_Address [] : una matriz de tipo ADDR que contiene la dirección de los procedimientos de caducidad del temporizador. Esta matriz solo existe si se ha activado el soporte para el procedimiento de caducidad del temporizador.
NUSE_Timer_Expiration_Routine_Parameter [] : una matriz de tipo U8 que contiene los valores del parámetro que se pasa a la función de finalización del temporizador. Esta matriz existe solo si se ha activado el soporte para funciones de finalización.

Estas estructuras de datos se declaran e inicializan (estáticamente) en el archivo nuse_config.c , por lo tanto:

 ROM U16 NUSE_Timer_Initial_Time[NUSE_TIMER_NUMBER] = { /*   ------ */ }; ROM U16 NUSE_Timer_Reschedule_Time[NUSE_TIMER_NUMBER] = { /*      ------ */ }; #if NUSE_TIMER_EXPIRATION_ROUTINE_SUPPORT || NUSE_INCLUDE_EVERYTHING /*    */ ROM ADDR NUSE_Timer_Expiration_Routine_Address[NUSE_TIMER_NUMBER] = { /*     ------ */ /*   NULL */ }; ROM U8 NUSE_Timer_Expiration_Routine_Parameter[NUSE_TIMER_NUMBER] = { /*     ------ */ }; #endif 

La cantidad de memoria para el temporizador.


Como todos los demás objetos de Nucleus SE, la cantidad de datos necesarios para los temporizadores es predecible.

La cantidad de datos en RAM (en bytes) para todos los temporizadores de la aplicación se puede calcular de la siguiente manera:
NUSE_TIMER_NUMBER * 4

La cantidad de datos en ROM (en bytes) para todos los temporizadores de la aplicación, si el soporte para las funciones de finalización está deshabilitado, se puede calcular de la siguiente manera:
NUSE_TIMER_NUMBER * 4

De lo contrario, es igual a:
NUSE_TIMER_NUMBER * (tamaño de (ADDR) + 5)

Llamadas API no realizadas


Nucleus SE no implementa las tres llamadas API que se pueden encontrar en RTOS.

Creación de temporizador


Esta llamada a la API crea un temporizador. Nucleus SE no lo necesita, ya que los temporizadores se crean de forma estática.

Prototipo de llamada de servicio:
ESTADO NU_Create_Timer (NU_TIMER * timer, CHAR * name, VOID (* expiration_routine) (UNSIGNED), UNSIGNED id, UNSIGNED initial_time, UNSIGNED reschedule_time, OPTION enable);

Parámetros:
timer - puntero al bloque de control del timer provisto por el usuario; se usará para controlar temporizadores en otras llamadas API;
nombre : puntero al nombre de 7 caracteres del temporizador con un cero final;
expiration_routine : indica la función que debe ejecutarse después de que finalice el temporizador;
id : un elemento de datos de tipo UNSIGNED que se pasa a la función de terminación: este parámetro se puede usar para identificar temporizadores con la misma función de terminación;
initial_time : indica el número inicial de tics del temporizador antes de que finalice el temporizador;
reschedule_time : indica el número de tics del temporizador hasta que se completen el segundo ciclo y los posteriores; si este parámetro es igual a cero, el temporizador se detiene solo una vez;
enable : este parámetro puede tomar los valores NU_ENABLE_TIMER y NU_DISABLE_TIMER ; NU_ENABLE_TIMER activa un temporizador después de que se crea; NU_DISABLE_TIMER deja el temporizador deshabilitado; los temporizadores creados con el parámetro NU_DISABLE_TIMER deben activarse llamando a NU_Control_Timer .

Valor de retorno:
NU_SUCCESS : la llamada se completó correctamente;
NU_INVALID_TIMER : un puntero nulo a una unidad de control del temporizador ( NULL ), o la unidad de control ya está en uso;
NU_INVALID_FUNCTION : puntero nulo al programa de finalización ( NULL );
NU_INVALID_ENABLE : parámetro de habilitación no válido;
NU_INVALID_OPERATION : el parámetro initial_time era cero.

Eliminar temporizador


Esta llamada a la API elimina un temporizador creado previamente. Nucleus SE no lo necesita, porque los temporizadores se crean de forma estática y no se pueden eliminar.

Prototipo de llamada de servicio:
ESTADO NU_Delete_Timer (NU_TIMER * timer);

Parámetros:
timer - puntero al bloque de control del temporizador.

Valor de retorno:
NU_SUCCESS : la llamada se completó correctamente;
NU_INVALID_TIMER : puntero de temporizador no válido;
NU_NOT_DISABLED : el temporizador especificado no está deshabilitado.

Punteros de temporizador


Esta llamada a la API forma una lista secuencial de punteros a todos los temporizadores del sistema. Nucleus SE no lo necesita, ya que los temporizadores están determinados por un índice simple, no por un puntero.

Prototipo de llamada de servicio:
NU_Timer_Pointers SIN FIRMAR (NU_TIMER ** pointer_list, UNSIGNED maximum_pointers);

Parámetros:
pointer_list : puntero a una matriz de punteros NU_TIMER ; se llenará de punteros a temporizadores configurados en el sistema;
maximum_pointers : el número máximo de punteros en la matriz.

Valor de retorno:
El número de punteros NU_TIMER colocados en la matriz.

Nucleus RTOS Compatible


Al igual que con todos los demás objetos de Nucleus SE, mi objetivo era maximizar la compatibilidad del código de la aplicación con Nucleus RTOS. Los temporizadores no son una excepción y, desde el punto de vista del usuario, se implementan de la misma manera que en Nucleus RTOS. , , , . , API Nucleus RTOS Nucleus SE.


Nucleus RTOS, — , . . , Nucleus SE : / . . – . , NUSE_TIMER U8 , ( ) . , Nucleus SE Nucleus RTOS . , .
Nucleus RTOS . . Nucleus SE, .


Nucleus RTOS 32- . 16 Nucleus SE. . Nucleus SE , .


Nucleus SE Nucleus RTOS , ( ), . , .

API


Nucleus RTOS . Nucleus SE. , , « API».

.

Source: https://habr.com/ru/post/455072/


All Articles