¿Cuál es la filosofía o el enfoque adoptado para implementar funciones de tiempo crítico en microcontroladores, si hay alguno?
Estoy trabajando en un proyecto que implica la salida de una forma de onda precisa de onda cuadrada de frecuencia variable. He hecho esto usando un temporizador y una función de interrupción. Sin embargo, incluso para implementar esto correctamente, tuve que calibrar el desplazamiento para la cantidad de ciclos de reloj tomados durante la rutina de servicio de interrupción. Me imagino que esta precisión se vería perturbada al tener otra forma de onda de este tipo corriendo al lado (digamos que la frecuencia necesitaba cambiarse exactamente al mismo tiempo). Tener un microcontrolador cada uno, para cada momento, la función crítica parece un desperdicio.
Tome otro ejemplo, de implementar una función de reloj (como en hh: mm: ss). No puedo imaginar que cada microcontrolador / computadora de alto nivel tenga un chip de reloj en tiempo real dedicado únicamente para hacer un seguimiento de la hora. Sin embargo, me resulta difícil imaginar que se mida con precisión utilizando el procesador central, que está ocupado atendiendo una gran cantidad de funciones que se producen a intervalos asincrónicos mientras tanto. Me imagino que el conteo de tiempo tendría errores de compensación, que cambian dependiendo de las funciones que se ejecutan.
¿Existe un proceso o enfoque de diseño para contener o dar tolerancia a la precisión que se puede lograr? ¿O alguien tiene alguna sugerencia o sugerencia sobre dónde podría encontrar más información al respecto?
fuente
Respuestas:
Para generar ondas cuadradas precisas, use el hardware. La mayoría de los microcontroladores tienen generadores PWM integrados que pueden hacer esto. Establece el período y el tiempo en ciclos de reloj, y el hardware hace el resto. Para cambiarlo a una nueva frecuencia, escriba el nuevo período en el registro del período y la mitad del período en el registro del ciclo de trabajo.
En cuanto a la pérdida de tiempo del reloj en tiempo real debido a otra carga del procesador, no funciona de esa manera a menos que esté mal escrito. En general, el hardware se usaría para crear una interrupción periódica que es un múltiplo de segundos, y el firmware se divide más a partir de ahí. Esto funciona independientemente de qué tan ocupado esté el procesador, ya que la interrupción se ejecuta siempre que sea necesario. Mientras la rutina de interrupción tome una pequeña fracción de los ciclos generales, la mayor parte del procesador todavía se aplica a la tarea en primer plano.
También hay formas de mantener el tiempo mediante encuestas a intervalos algo desconocidos. Tiene el hardware para llevar un recuento, y cada vez que llega a actualizar el reloj, lo actualiza en función del número total de tics transcurridos. Mientras esta rutina se ejecute con la frecuencia suficiente para que cualquier contador que se use no se ajuste entre ejecuciones, no se perderá tiempo.
fuente
La palabra clave aquí es "soporte de hardware". Para cualquier cosa grave, necesitará hardware de soporte en el µC. El periférico integrado más común es el circuito del temporizador que funciona de manera relativamente precisa y sin interferencia de otras operaciones de la CPU.
Partiendo de eso, puede tener muchas funciones ejecutándose con temporización a medio plazo tan precisa como la fuente de reloj de su controlador.
Pero: como ya habrás experimentado, además de la precisión a medio o largo plazo, siempre hay fluctuación de tiempo involucradas en el manejo del software de eventos de hardware (incluidas cosas como el desbordamiento del temporizador). Esto es causado por diferentes estados posibles de ejecución en el momento en que ocurre un evento que resulta en demoras variables hasta que la respuesta real al evento pueda ocurrir.
Por lo tanto, la conclusión es: para cualquier cosa con requisitos de jitter de alta velocidad o casi cero, el soporte de hardware es esencial. Muchos periféricos de hardware están incluidos en la mayoría de los µC, como los UART & c, y cuanto más potente y costoso es el µC, más hardware de soporte suele estar incorporado. Si su µC no proporciona el hardware que necesitaría, tendrá que considerar un hardware externo dedicado para la tarea.
fuente
Haga todo lo que pueda con el hardware, especialmente para funciones que requieren mucho tiempo. Todos los microcontroladores tienen temporizadores / contadores creados específicamente para contar y cronometrar eventos.
Aparte de eso, esta es realmente una pregunta muy amplia. Entonces no hay una buena respuesta.
La única respuesta verdadera es la experiencia. Pruébelo, perfílelo, estreselo, arréglelo. Debe identificar áreas de código con alto uso. El 20% del software que se ejecuta el 90% del tiempo, significa que cada instrucción eliminada mejora el rendimiento.
El buen diseño siempre ha equilibrado el hardware, el software y la memoria. Esto se aplica a todos los microprocesadores, pero especialmente a los microcontroladores. Maximiza uno o usa uno de manera ineficiente y tendrás un producto pobre. A medida que aumentan las densidades de silicio, se incluyen cada vez más funciones en el hardware de los microcontroladores. Pero más características significan más expectativas. Doble memoria integrada y agregará alguna característica que la usa.
Todos los ISR tienen gastos generales, que dependen de los registros utilizados por el ISR. Si la latencia para guardar el estado de la máquina es significativa en comparación con el mantenimiento del ISR para funciones muy importantes, su diseño puede no ser escalable. Por lo tanto, el consenso general de respuestas para usar hardware.
El uso de interrupciones de software puede disminuir la hinchazón del estado de la máquina ISR.
Todos los registros para Inc_Seconds () deben ser empujados, cuando solo se usan una vez cada 150 ciclos.
Ahora el golpe de latencia solo ocurre una vez cada 150 ciclos.
Si implementa un reloj en tiempo real en hh: mm: ss, ¿importa si está apagado a 50 ms? Ninguna persona detectaría el error. Esto ciertamente no es una preocupación operativa en tiempo real.
En cuanto a los eventos que deben ocurrir al mismo tiempo. ¿Deben ellos? Si deben hacerlo, el diseño del hardware debe cuidarlo. De lo contrario, debe producirse un compromiso de software. Si no puede establecer dos bits a la vez, configure uno. La siguiente instrucción establece la otra. Precisión de un ciclo de reloj en procesadores RISC. Yo diría que eso fue lo suficientemente bueno.
fuente
Para la forma de onda cuadrada, debe usar un periférico PWM que esté PLL con su XTAL usando algún tipo de contador para saber cuándo hacer un ciclo (para configurar la frecuencia baja). Cada hoja de datos le dirá cómo hacerlo :)
Para mantener el tiempo , sí, necesitará un RTC para hacerlo con precisión a menos que vaya al ensamblador y los códigos de operación del autor para que sepa a mano el momento exacto de ejecución de cada instrucción en cualquier ruta de ejecución. Probablemente también arrojará nueva luz sobre la probada y verdadera declaración 'goto se considera dañino'.
fuente