Toda la verdad sobre RTOS. Art铆culo # 27. Hora del sistema

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:
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.

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_SET
NUSE_CLOCK_RETRIEVE

Por 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 RTOS

Prototipo 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 SE
Esta 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 SE
El 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 RTOS

Prototipo 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 SE
Prototipo 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 SE
El 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.

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


All Articles