Estimar la frecuencia con la que se ejecuta su microcontrolador

1

Recientemente comencé a programar un microcontrolador ATtiny85, que según la hoja de datos se ejecuta a 10Mhz dado el suministro de 3v3. Entonces, para experimentar, he creado un pequeño programa, como se muestra a continuación.

#include <avr/io.h>

int main(void) {
    DDRB |= 8;
    while(1) {
        for(int i = 0; i < 1000; i++)
            for(int j = 0; j < 1000; j++)
                asm volatile("nop");
        PORTB ^= 8;
    }
}

Según la documentación, cada nop tomará exactamente un ciclo de reloj para completarse. Ahora, he compilado este programa usando Atmel-Studio-7, y programé el diminuto usando un clon usbasp y avrdude. Como nota al margen, el puente de la fuente de alimentación en usbasp se establece en 3v3.

La programación funcionó bien, y comencé a mirar el LED parpadeante en el pin-2 y me pareció bastante lento. Cuando medí el retardo entre las luces LED que usan un cronómetro, podría medirlo en exactamente 5 segundos. Según mi código, cada vez, 1000000 nops se ejecutan antes de cada conmutación. Por un simple cálculo, parece que mi pequeño podría ejecutar solo 200000 nops por segundo, lo que significa que se está ejecutando en 200Khz , lo que no tiene ningún sentido.

¿Cuáles podrían ser los factores que contribuyen a este error? ¿Cómo estimar la velocidad del reloj de un microcontrolador por su salida?

    
pregunta Subin Sebastian

2 respuestas

10

Echa un vistazo a la salida del compilador aquí enlace . Observe que el bucle interno for y las líneas asm("nop") corresponden a 3 instrucciones de ensamblaje, dos de las cuales ( sbiw y brne ) toman dos ciclos (para brne cuando se toman). Entonces, en lugar de tomar un ciclo por bucle interno como lo predijiste, toma 5.

Y, de hecho, si multiplica su frecuencia de reloj medida por 5, sale a 1MHz, que es la velocidad de reloj predeterminada de ATTiny según la hoja de datos.

  

El dispositivo se envía con CKSEL="0010", SUT="10" y CKDIV8 programado. La configuración predeterminada de la fuente del reloj   Por lo tanto, el oscilador RC interno funciona a 8 MHz con el tiempo de arranque más largo y un reloj inicial del sistema.   preescalado de 8, lo que resulta en un reloj del sistema de 1.0 MHz

    
respondido por el C_Elegans
5

No puedes probar la velocidad de un microcontrolador midiendo cuánto tiempo lleva ejecutar números de instrucción desconocidos.

No hay garantía de qué instrucciones exactas genera el compilador a partir de su código. Busque en algún tipo de listado de salida de código de máquina o escriba su prueba en el ensamblador. De cualquier manera, necesita saber exactamente qué instrucciones se están ejecutando.

Una vez que conozca las instrucciones, sume cuántos ciclos en el ciclo y, por lo tanto, cuánto tiempo debe tomar cada iteración. Solo así podrá sacar conclusiones sobre la velocidad de instrucción y la frecuencia de reloj.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas