Métodos de utilización de la CPU

Para cumplir con los gastos de los clientes y completar los informes de los clientes sobre el dispositivo, también hay una sección sobre la utilización de la CPU. Debido a que nunca he hecho tal tarea antes, he revisado algunos artículos de "Búsqueda de Google". Muchos de los artículos están en conexión directa con la programación de Linux, muchos de ellos hablan en general sobre la utilización de la CPU (solo teórica) y no encontré ningún artículo sobre el método de cómo se puede hacer esto... está bien, hay algunos: Embedded.com .

Me interesa cómo USTED ha hecho ese trabajo de sincronización de tareas antes. Estoy interesado en el método y también con qué herramienta se hizo. ¿Con alguna medición directa en el osciloscopio (o analizador lógico) o capturando datos del osciloscopio y postprocesándolos? ¿Qué período de tiempo debe tomarse para calcular la utilización de la CPU: el "momento más ocupado" cuando todas las interrupciones están presentes, porque en este caso la utilización de la CPU es mucho mayor que tal vez 1 milisegundo o 1 microsegundo más tarde, cuando solo se está ejecutando el bucle de fondo?

Tal vez como referencia, cómo hice mi primer enfoque de utilización de CPU (no sé si es el enfoque correcto): cada interrupción cuando comienza a ejecutarse tiene un PIN dedicado que aumenta cuando comienza la interrupción y disminuye cuando finaliza la interrupción. También hay los mismos retrasos de propagación involucrados. Exporto estas señales sobre el osciloscopio en un archivo y las postproceso con octava. Todavía hay un problema sobre qué plazo tomar.

En caso de cualquier pregunta por favor escriba en la sección de comentarios

¿Qué plataforma MCU estás usando? ¿Qué tipo de interfaz de depuración tiene? Algunos microcontroladores admiten mecanismos de seguimiento avanzados en los que puede perfilar la utilización de la MCU a través de la interfaz de depuración. Ejemplo para STM32
Es un microcontrolador MSP430. Estamos utilizando la versión 5.40.3 de IAR. Entonces, creo que no se incluye tal herramienta, ¿tal vez en las nuevas versiones?
Hay muchos métodos posibles, use cualquiera que le dé a su equipo de diseño y/o al cliente la confianza de que su software siempre funcionará. A menudo se dividen en dos categorías, tareas de alta prioridad que deben ejecutarse en un marco de tiempo determinado (he usado un GPIO, como su ejemplo de interrupción para esto); y tareas de menor prioridad que simplemente nunca deben retrasarse demasiado. A menudo he tenido un requisito de "rendimiento adicional" para este último, el software puede calcular fácilmente este mismo seguimiento de los recuentos del temporizador cuando está inactivo.
@Pukaai No sé acerca de v5, pero aparentemente IAR v7 tiene perfiles de función bajo la función EnergyTrace. Guía del usuario
¡Gracias Bora! No sabía sobre EnergyTrace, debo echarle un vistazo si puedo usarlo (algunos ejemplos y preguntarle al jefe sobre la actualización del IAR). En este enlace de video también noté (44:15) que "EnergyTrace++ no es un rastro digital de alta velocidad. La velocidad típica es de 1kHz a 4kHz...". Una de mis interrupciones debe ejecutarse en un máximo de 100 us, por lo que probablemente no se ajuste a mis necesidades. ¡Gracias Bora!

Respuestas (1)

La utilización de la CPU es realmente solo una medida cruda de la resistencia general de un sistema en tiempo real. Por lo tanto, la respuesta a su pregunta es que generalmente es un valor promedio a largo plazo.

El criterio real es si todas las tareas de software cumplen con los plazos de finalización. Tenga en cuenta que esto incluye tanto tareas desencadenadas por interrupciones como tareas desencadenadas por otros tipos de eventos. Cuando la utilización de la CPU comienza a acercarse al 100 %, el tiempo de finalización de las tareas de menor prioridad tiende a volverse arbitrariamente grande.

El uso de pines GPIO para indicar el tiempo de ejecución de tareas individuales es una buena manera de verificar si esos plazos se superan alguna vez.

Otro enfoque es instrumentar el propio código. Si tiene acceso a un contador de ejecución libre (quizás, un módulo de temporizador/contador de hardware de repuesto), puede tomar una instantánea de su valor al comienzo de cada tarea y luego, al final de la tarea, tomar otra instantánea. y calcula la diferencia. Si esto alguna vez excede el valor requerido para esa tarea, indique un error.


Una pregunta ligeramente diferente sería calcular la utilización esperada de la CPU de un sistema, antes de implementarlo.

En este caso, considera cada tarea individualmente, calculando cuánto tiempo se ejecuta cuando se activa y con qué frecuencia se activa. El tiempo de ejecución dividido por el período de activación proporciona la utilización de la CPU para esa tarea por sí misma.

Si suma todos los valores de utilización individuales y obtiene un valor que se acerca o supera el 100 %, entonces debe pensar en formas de redistribuir el trabajo: CPU más rápida, más CPU, hardware dedicado para algunas tareas, etc.

¡Gracias Dave! Ya tengo contadores implementados para cada tarea; el problema es que la tarea 3 es más larga porque la tarea 2 tiene prioridad sobre la tarea 3, y la tarea 2 es más larga porque la tarea 1 tiene mayor prioridad sobre la tarea 2 y la tarea 3... en resumen: T1 (prioridad más alta) > T2 > T3 (prioridad más baja). Entonces, lo que obtengo son los tiempos máximos de cada tarea y no encontré la solución para cancelar el temporizador cuando se activa una nueva tarea con la prioridad más alta. Necesito resultados de tiempos reales (los tiempos de menor prioridad no son reales).
Entonces, tal vez la forma más fácil es en el osciloscopio para disparar la más larga, por ejemplo, "Tarea 2" y menos interrupciones de la "Tarea 1" y obtendré el "número real", solo que al medir puede haber algunas desviaciones. Entonces obtendré los números de tiempo y puedo calcular la "Programación en tiempo real"
Pero no desea "cancelar el temporizador" cuando se ejecuta una tarea de mayor prioridad; el punto es que la tarea de mayor prioridad contribuye directamente al tiempo de finalización de las tareas que interrumpe. Entonces, si la fecha límite de finalización para T2 no es mayor que el tiempo de ejecución real de T2 MÁS el de T1, ¡entonces está en problemas!
Creo que te entiendo :) ¡Gracias! Una pregunta... ¿puedo usar "Real Time Scheduling -> Rate Monotonic Approach" en este caso (estoy usando MSP430), o es solo para, por ejemplo, el sistema Linux Embedded? Porque en mi caso hay tres tareas: Tarea 1 (prioridad más alta) > Tarea 2 > fondo (prioridad más baja)
No estoy seguro de a qué te refieres, ya que no veo ningún encabezado de ese tipo en el artículo que vinculaste. Pero suponiendo que sea algo similar a la descripción de Wikipedia , no ha proporcionado suficiente información sobre las tareas en su sistema para saber si cumplen con los criterios descritos allí. Puedo decir que no es solo para sistemas basados ​​en Linux.
¡Gracias! Lo siento por faltar información, pero proporcionó el enlace correcto: es exactamente lo que tengo en mente. ¡Gracias! Acerca de las tareas... la más corta tiene la prioridad más alta y así sucesivamente - round robin con interrupciones
Al calcular el enfoque monotónico de velocidad y su límite específico, ¿debo contar también el bucle principal en este cálculo como una tarea o no porque se ejecuta solo en estado inactivo? Leí algunas fuentes y una de ellas dice: "El análisis matemático de la programación monótona de la tasa determina que las tareas en tiempo real (es decir, las tareas con plazos específicos en tiempo real) son programables cuando la utilización está por debajo del 70%", por lo que el bucle de fondo no tiene plazo, me equivoco?