8 votos

La medición de la carga de la cpu de la rutina de interrupción

Tengo un isr que es la actualización de una pantalla a una frecuencia fija. Me gustaría afinar mi rutina para minimizar la sobrecarga y mantener el mayor tiempo de cpu como sea posible abrir para otros procesos de tratamiento, pero no tengo ninguna buena manera de recopilar métricas para determinar mi carga de la cpu.

Yo podía mirar a la asamblea y analizar la rutina, pero no tengo la paciencia o la capacidad para hacerlo con precisión. Yo no siento que necesito terriblemente de grano fino resultados, sólo un simple porcentaje de tiempo de cpu ocupada por el isr.

Yo podría establecer un pin de alto sólo cuando el isr es activo y medir externamente. Que tiene un mínimo de sobrecarga en el código, pero no sé en qué medida. No tengo un osciloscopio, o algo como eso. Hay una simple ic o una manera fácil de utilizar otro micro para medir el ciclo de trabajo? He oído hablar de los dedicados contador de frecuencia chips, pero hay algo de ciclo de trabajo?

11voto

lillq Puntos 4161

Establecer un pin de salida cuando usted entra en el ISR y claro antes de volver a partir. Filtro de la salida con un filtro RC. El voltaje a través del condensador debe darle el ISR del ciclo de trabajo.
Por ejemplo, si su fuente de alimentación es de 3.3 V y medir 33mV, luego de gastar el 1% del tiempo en el ISR.

8voto

kender Puntos 18446

Sólo la mitad del horno idea, usted podría ser capaz de hacer uso de los temporizadores como (pseudo código):

int main(void)
{

    /* ... init timers and uart here, enable your interrupts ... */

    start_timer0();
    while (!timer1Started()){}
    stop_timer1();

    uart_puts("Idle ticks: %d, ISR ticks: %d", timer0_value, timer1_value);

}

y en la pantalla de ISR...

ISR_display()
{
    stop_timer0();
    start_timer1();

    /* ... your ISR routine ... */
}

He hecho un par de asunción aquí. 1 - que no estás usando tu temporizadores para otra cosa, y que, 2 - la sobrecarga de iniciar y detener un temporizador es mínima (normalmente se hace con un registro único de escritura). EDIT: y un 3er supuesto, usted puede capturar todo esto antes de que el temporizador se produce desbordamiento, pero tal vez puedas dar cuenta de que así.

Habrá algún cambio de contexto la sobrecarga de que usted no será capaz de captar, y esto también añade dos operaciones adicionales en el ISR (asegúrese de utilizar macros para su start_timer/stop_timer para eliminar la función de la sobrecarga de la llamada). Si usted puede conseguir el número total de ciclos utilizados para start+stop temporizador de macros, entonces puede restar las garrapatas de la timer1_value para obtener el ISR de las garrapatas valor de un poco más de precisión. Su cálculo final de % de tiempo de CPU utilizado simplemente sería:

$$ Usage_{cpu} = (\frac{Ticks_{isr}}{Ticks_{isr} + Ticks_{inactivo}}) * 100 $$

7voto

RelaXNow Puntos 1164

La forma más fácil de hacerlo es ejecutar el código en el simulador y medir los ciclos adoptadas por la rutina de interrupción. El Microchip MPLAB simulador, por ejemplo, cuenta con un práctico cronómetro característica que es muy útil para este propósito.

En su defecto, la crianza de un pin en el inicio de la interrupción y bajar al final puede ayudar. La forma más fácil de verlo es con un osciloscopio. Si usted está haciendo el microcontrolador y los proyectos de electrónica, usted debe conseguir uno de todos modos.

Sin un alcance, usted podría simplemente filtro de paso bajo en el pin de voltaje, a continuación, medir con un voltímetro. Que el voltaje dividido por la potencia del procesador de voltaje le dará la fracción de tiempo que el pin es alta. Por ejemplo, si el procesador está ejecutando en 3.3 V y el filtrado de paso bajo pin de voltaje es 800mV, entonces el pin es de alta 800mV / 3.3 V = 24% del tiempo.

Ya que están, al parecer, el uso de un compilador, usted necesita para aminorar esta respuesta un poco. El compilador es probable que la adición de algunos de interrupción de entrada de código antes de su código se ejecuta y la interrupción de código de salida después de que se ejecuta el código. El verdadero tiempo de interrupción se extienden un par de ciclos en cualquiera de los lados del pulso. Por supuesto, si usted se preocupa por interrumpir la sincronización, usted no debería estar usando un compilador en el primer lugar.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X