Tiempo de ejecución límite máximo para un progrm de cpu de atmega8 [cerrado]

-2

¿Es correcto decir que un programa que se ejecuta en una CPU atmega8 (escrito en C incrustado en avr studio) puede ejecutarse de principio a fin en menos de un milisegundo?

Me refiero al código C en el "bucle para siempre" en ATMEGA 8. Para simplificar el análisis del programa, hay un máximo de 40 variables (entero) en él, no en un punto flotante. Todas las instrucciones en el bucle leen los pines, hacen algunas operaciones matemáticas con la entrada de los pines, y luego escriben en los pines, no hay otro bucle en el ciclo para siempre. Las operaciones matemáticas son +, -, * y / y hay un máximo de 40 variables. Todos los demás códigos pueden tomarse como instrucciones de decisión, por lo que es solo una secuencia de instrucciones en el bucle para siempre y no saltar en ningún lugar. Así que las instrucciones se procesan en secuencia y el programa no se detiene. También asumimos que dicho programa llena toda la memoria del programa para un programa en C.

El atmega8 funciona a 8Mhz (8 millones de ciclos de máquina por segundo) con el reloj incorporado, por lo que parece razonable decir que en 1 ms un programa en C ejecutará al menos unos cientos de veces, si no es un número masivamente grande.

¿O necesito usar un cristal para decir que se ejecutará de principio a fin al menos una vez en 1 ms?

La respuesta no es obvia para mí.

Si no puede calcular la respuesta, ¿cuál es una buena suposición?

8 mhz significa 8000 instrucciones de código de máquina en 1 ms. Entonces, la pregunta es si el programa (de la forma anterior) se ejecuta más lentamente, ¿llevará más de 8000 instrucciones hacer el ciclo una vez que esté en 1 ms? Esto parece razonable para los guerss de que esto es cierto.

Para usar una analogía, en algunos motores del juego se ofrece la posibilidad de ejecutar el ciclo para siempre a 60 veces (o cuadros) por segundo como mínimo, con cualquier código codificado para el juego en el circuito por el programador

    
pregunta qwerty10

1 respuesta

1

El ATMega8 tiene 8192 bytes del programa ROM. La memoria del programa tiene 16 bits de ancho, por lo que puede contener un máximo de 4095 instrucciones de código de máquina (sin contar el vector de reinicio). Si un programa de código de máquina que consistiera en nada más que NOP llenara la ROM completa, entonces a 8MHz tomaría 4095/8 = ~ 0.512mS para ejecutarse.

Pero está considerando un programa en C que incluye * y / operadores. Multiplicar o dividir valores arbitrarios con código en línea directo consumiría demasiada memoria, por lo que el compilador genera código con bucles. Esto requiere más ciclos de ejecución que la cantidad de palabras de programa utilizadas. Por ejemplo, el código en el bucle while(1) en este programa ...

#include <avr/io.h>

int main(void){
int i,j;
while (1)
 {
  i=(PINB+37)/11;
  j=(PINC-3)*7;
  PORTD=i+j;  
 }
}

... solo ocupa 64 palabras de ROM, pero tarda 248 ciclos en ejecutarse.

    
respondido por el Bruce Abbott

Lea otras preguntas en las etiquetas