El concepto de tiempo en el contexto de RTOS se introdujo en uno de los
art铆culos anteriores , junto con la idea de funciones relacionadas con el tiempo disponibles en RTOS.

Art铆culos anteriores de la serie: Temporizador de tic
Todas las funciones relacionadas con el tiempo est谩n controladas por un reloj de hardware. Este es un oscilador simple que genera solicitudes de interrupci贸n a intervalos regulares. Para que los n煤meros de reloj tengan sentido para los programas de aplicaci贸n, se debe conocer la frecuencia del generador.
Manejo de interrupci贸n del temporizador
Las interrupciones generadas por el temporizador de hardware deben ser atendidas de manera espec铆fica en el controlador de interrupciones (Rutina de servicio de interrupci贸n, ISR), que implementa todas las funciones RTOS relacionadas con el tiempo. Los detalles del controlador de interrupci贸n del temporizador en Nucleus SE se analizar谩n en uno de los siguientes art铆culos.
Funciones relacionadas con el tiempo.
Nucleus RTOS y Nucleus SE contienen varios mecanismos relacionados con el tiempo:
- Reloj tick del sistema (Tick clock) : un contador simple que se incrementa utilizando un controlador de interrupci贸n del temporizador. Tanto Nucleus RTOS como Nucleus SE tienen un contador de 32 bits y las tareas tienen mecanismos para leer y escribir su valor. En Nucleus SE, un temporizador de reloj es opcional.
- Temporizadores de aplicaci贸n : tanto Nucleus RTOS como Nucleus SE admiten objetos de temporizador. Su uso e implementaci贸n en Nucleus SE se discutir谩 con m谩s detalle en el pr贸ximo art铆culo.
- Programaci贸n de segmentos de tiempo : en Nucleus RTOS, las tareas con la misma prioridad se sirven usando el algoritmo Round-robin, pero tambi茅n puede usar el corte de tiempo. En Nucleus SE, un planificador de segmentaci贸n de tiempo es opcional; esto se ha discutido en detalle en art铆culos anteriores (una vista general del planificador de TS (segmento de tiempo) y TS en Nucleus SE ).
- Suspender una tarea (Tarea inactiva) : una tarea puede detenerse sola ("quedarse dormida") durante un per铆odo fijo de tiempo. Este mecanismo ya se ha descrito en detalle anteriormente .
- Tiempos de espera de llamadas de API : tanto en Nucleus RTOS como en Nucleus SE, algunas llamadas de API le permiten pausar una tarea mientras espera que un recurso est茅 disponible. La pausa puede ser indefinida o, en el caso de Nucleus RTOS, puede indicarse un per铆odo de tiempo de espera opcional (per铆odo de espera). Nucleus SE no admite tiempos de espera de llamadas API.
Precisi贸n
Y ahora vale la pena contar brevemente sobre la precisi贸n del temporizador del sistema.
La precisi贸n de las funciones de tiempo depende directamente de la frecuencia del generador de reloj. Por ejemplo, si los pulsos llegan cada 10 milisegundos, y la tarea de la aplicaci贸n necesita un retraso de 100 milisegundos, obviamente necesita 10 pulsos. Sin embargo, no se sabe cu谩ndo se recibi贸 el impulso anterior: podr铆a haber sucedido hace apenas 10 milisegundos. Por lo tanto, un retraso de 100 milisegundos puede tomar hasta 110 milisegundos.
Una forma obvia de resolver este problema es aumentar la frecuencia del generador. Si los pulsos siguen a intervalos de 1 milisegundo, un retraso de 100 milisegundos nunca tomar谩 m谩s de ciento un milisegundo. La desventaja de esta soluci贸n es que el controlador de interrupci贸n del temporizador tomar谩 10 veces m谩s tiempo de procesador, lo que ser谩 excesivo. El dise帽ador del sistema debe encontrar un equilibrio entre la precisi贸n necesaria del temporizador y la potencia del procesador disponible.
Ajuste de hora del sistema
Al igual que con la mayor铆a de los objetos de Nucleus SE, la configuraci贸n de hora del sistema est谩 controlada en su mayor parte por las directivas
#define en el archivo
nuse_config.h . El par谩metro principal es
NUSE_SYSTEM_TIME_SUPPORT , que activa el mecanismo de soporte de hora del sistema. No necesita especificar el n煤mero de objetos: la hora del sistema est谩 activada o no.
La elecci贸n de un valor distinto de cero es el activador principal de la hora del sistema. Este par谩metro se utiliza al definir estructuras de datos, que se discutir谩n en detalle m谩s adelante en este art铆culo. Adem谩s, un valor distinto de cero activa la configuraci贸n de la API.
Activaci贸n API
Cada funci贸n API (llamada de utilidad) en Nucleus SE tiene una directiva activadora #define en el archivo nuse_config.h. Para la hora del sistema, estos s铆mbolos son:
NUSE_CLOCK_SETNUSE_CLOCK_RETRIEVEPor defecto, 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 la hora del sistema en la aplicaci贸n, debe seleccionar las llamadas de servicio API necesarias y establecerlas en
VERDADERO .
El siguiente es un fragmento de c贸digo del archivo predeterminado nuse_config.h.
#define NUSE_SYSTEM_TIME_SUPPORT FALSE /* */ #define NUSE_CLOCK_SET FALSE /* */ #define NUSE_CLOCK_RETRIEVE FALSE /* */
Si intenta utilizar la llamada del servicio API de hora del sistema cuando el activador de hora del sistema est谩 apagado, 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.
Llamadas de utilidad de hora del sistema
Nucleus RTOS admite dos llamadas de servicios p煤blicos que se relacionan con la hora del sistema y proporcionan la siguiente funcionalidad:
- Establecer el valor de la hora del sistema. Nucleus SE se implementa en la funci贸n NUSE_Clock_Set () .
- Obteniendo el valor del tiempo del sistema. Nucleus SE se implementa en la funci贸n NUSE_Clock_Retrieve () .
Considere la implementaci贸n de cada una de estas llamadas con m谩s detalle.
Llamadas de servicio para configurar y obtener la hora del sistema
Con la hora del sistema, solo puede realizar operaciones de configuraci贸n a un valor dado y obtener el valor actual. Nucleus RTOS y Nucleus SE proporcionan dos llamadas API b谩sicas para implementar estas operaciones.
La interpretaci贸n del valor de tiempo del sistema depende de la aplicaci贸n, ya que es esencialmente un contador del n煤mero de "ciclos de reloj" que han ocurrido desde el 煤ltimo reinicio del contador. Para usar esta informaci贸n, se debe conocer la frecuencia del generador.
Ajuste de la hora
Cualquier tarea puede establecer la hora del sistema llamando a esta funci贸n API.
Llame para configurar la hora del sistema en Nucleus RTOSPrototipo de llamada de servicio:
ANULAR NU_Set_Clock (UNSIGNED new_value);Par谩metros:
new_value : valor que se asignar谩 a la hora del sistema
Valor de retorno: ninguno.
Llame para configurar la hora del sistema en Nucleus SEEsta llamada a la API admite la funcionalidad principal de la API Nucleus RTOS.
Prototipo de llamada de servicio:
anular NUSE_Clock_Set (U32 new_value);Par谩metros:
new_value : valor que se asignar谩 a la hora del sistema
Valor de retorno: ninguno
Implementaci贸n de la configuraci贸n de tiempo en Nucleus SEEl c贸digo es muy simple. El valor proporcionado se escribe en
NUSE_Tick_Clock dentro de la secci贸n cr铆tica.
Obtener hora del sistema
Una tarea puede obtener el valor de hora del sistema utilizando esta funci贸n API.
Llame para obtener la hora del sistema en Nucleus RTOSPrototipo de llamada de servicio:
NO FIRMADO NU_Retrieve_Clock (VOID);Par谩metros: ninguno
Valor de retorno: valor actual de la hora del sistema
Llamar para obtener la hora del sistema en Nucleus SEPrototipo de llamada de servicio:
U32 NUSE_Clock_Retrieve (nulo);Par谩metros: ninguno
Valor de retorno: valor actual de la hora del sistema
Implementaci贸n de adquisici贸n de tiempo en Nucleus SEEl c贸digo es muy simple. La funci贸n devuelve el valor
NUSE_Tick_Clock obtenido en la secci贸n cr铆tica.
Estructuras de datos
La hora del sistema usa una estructura de datos (ubicada en la RAM), que es una palabra de 32 bits.
Recomiendo encarecidamente que el c贸digo de la aplicaci贸n no utilice el acceso directo a esta estructura de datos, sino que acceda a 茅l 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. Los detalles de las estructuras de datos se proporcionan a continuaci贸n para simplificar la comprensi贸n del c贸digo de llamada de servicio y la depuraci贸n.
Datos de RAM
Estructura de datos:
NUSE_Tick_Clock : una variable de tipo
U32 , que almacena el contador de reloj de la hora del sistema.
Esta estructura de datos se inicializa a cero mediante la funci贸n
NUSE_Init_Task () cuando se inicia Nucleus SE. Uno de los siguientes art铆culos proporcionar谩 una descripci贸n completa de los procedimientos de inicio de Nucleus SE.
Datos ROM
No hay estructuras de datos asociadas con la hora del sistema en ROM.
La cantidad de memoria para la hora del sistema
Como todos los dem谩s objetos de Nucleus SE, la cantidad de memoria requerida para el tiempo del sistema es predecible.
La cantidad de memoria en ROM es 0.
La cantidad de memoria en RAM (en bytes) es siempre 4.
Llamadas API no realizadas
Todas las llamadas de servicio API Nucleus RTOS en tiempo de sistema tienen un equivalente en Nucleus SE.
Compatible con Nucleus PLUS
Al igual que con todos los dem谩s objetos de Nucleus SE, mi objetivo era asegurar que el c贸digo de la aplicaci贸n sea lo m谩s compatible posible con Nucleus RTOS. La hora del sistema no es una excepci贸n y, desde el punto de vista del usuario, se implementa de la misma manera que en Nucleus RTOS. Las llamadas a la API Nucleus RTOS se pueden portar directamente a Nucleus SE.
En el siguiente art铆culo consideraremos temporizadores de software.