Tengo un ISR que está actualizando una pantalla a una frecuencia fija. Me gustaría ajustar mi rutina para minimizar la sobrecarga y mantener abierto el mayor tiempo posible de CPU para otro procesamiento, pero no tengo una buena manera de recopilar métricas para determinar mi carga de CPU.
Podría mirar la asamblea y analizar la rutina, pero no tengo la paciencia o la capacidad para hacerlo con precisión. Tampoco siento que necesito resultados extremadamente finos, solo un porcentaje simple de tiempo de CPU ocupado por el ISR.
Podría establecer un pin alto solo cuando el ISR está activo y medirlo externamente. Eso tiene un mínimo de sobrecarga en el código, pero no sé con qué medirlo. No tengo un osciloscopio ni nada de eso. ¿Existe un ic simple o una manera fácil de usar otro micro para medir el ciclo de trabajo? He oído hablar de chips de contador de frecuencia dedicados, pero ¿hay algo para el ciclo de trabajo?
fuente
Establezca un pin de salida cuando ingrese el ISR y bórrelo antes de regresar de él. Filtre la salida con un filtro RC. El voltaje a través del condensador debería darle el ciclo de trabajo ISR.
Por ejemplo, si su fuente de alimentación es de 3.3V y mide 33mV, entonces pasa el 1% del tiempo en el ISR.
fuente
La forma más fácil de hacer esto es ejecutar el código en el simulador y medir los ciclos tomados por la rutina de interrupción. El simulador Microchip MPLAB, por ejemplo, tiene una práctica función de cronómetro que es muy útil para este propósito.
De lo contrario, levantar un alfiler al comienzo de la interrupción y bajarlo al final puede ayudar. La forma más fácil de ver eso es con un osciloscopio. Si está haciendo proyectos de microcontroladores y electrónica, debería obtener uno de todos modos.
Sin un osciloscopio, simplemente podría filtrar el voltaje del pin de paso bajo y luego medirlo con un voltímetro. Ese voltaje dividido por el voltaje de alimentación del procesador le dará la fracción del tiempo que el pin está alto. Por ejemplo, si el procesador funciona con 3.3V y el voltaje del pin filtrado de paso bajo es 800mV, entonces el pin es alto 800mV / 3.3V = 24% del tiempo.
Como aparentemente está utilizando un compilador, debe reducir un poco esta respuesta. Es probable que el compilador agregue algún código de entrada de interrupción antes de que se ejecute su código e interrumpa el código de salida después de que se ejecute su código. El verdadero tiempo de interrupción se extenderá unos pocos ciclos a cada lado del pulso. Por supuesto, si le preocupa el tiempo de interrupción, no debería usar un compilador en primer lugar.
fuente