6 votos

Millis frente Centis en la plataforma AVR

Estoy construyendo un dispositivo en la plataforma AVR. El dispositivo necesitará un poco de información de temporización, así que tengo que pensar reimplementing Arduino millisde funcionalidad similar (aunque no exactamente como esta). Sin embargo, después de hacer algunas parte posterior de la envolvente de los cálculos (en parte basado en este post), que empezó a aparecer a mí que millis consume al menos un 5% del tiempo de CPU en un 20 mhz de procesador, y proporcionalmente más de lo que en un 16Mhz uno:

  • Cada milésima de segundo, el temporizador (timer0) se desborda, se activa una interrupción, que se incrementa millis
  • Un informe de búsqueda internacional debe tomar el 26 de relojes de pre/post ISR rutina (5 PUSH + POP más CLR, INy RETI
  • El ISR propio debe tomar alrededor de 21 relojes (de carga valor de 32 bits, lo incrementan, y la tienda de nuevo en SRAM)
  • Esto produce casi el 50 relojes, o 50 microsegundos cada milisegundo.
  • De hecho, Arduino ISR función es más lento de lo que (según lo revelado por este post), porque es muy cuidadoso acerca de cómo mantener millis tan exactos como sea posible, lo que lleva a más ciclos de CPU todavía

No necesito millis de precisión, por lo que estoy considerando la implementación de centis o, incluso, decis a guardar los ciclos del procesador para otras cosas. Es esto razonable? Son mis cálculos mal? Parece una extraña elección de diseño, o me estoy perdiendo algo?

1voto

silverbolt Puntos 18

50 relojes no es de 50 a nosotros cuando ejecutan a 16 MHz, es de aproximadamente 3 nosotros. Así 0.3% gastos generales, no el 5%. Sin duda se puede hacer eso, pero nunca he tenido ningún problema con el funcionamiento de un pequeño ISR a 1 kHz igual que antes. Podría ser una buena idea para volver a implementarlo apenas así que usted puede agregar más cosas a ejecutar en cada uno de temporizador de intervalo, o programar cosas para que se ejecute en el futuro las garrapatas. Un método que yo uso muy a menudo es programar algo para que se ejecute, por ejemplo, en intervalos de 1 segundo por almacenar el tiempo actual + intervalo en una variable y luego, cuando el tiempo excede el futuro de marca de hora, me incrementar la marca de hora por la inteval y, a continuación, ejecute el código. Si una garrapata se omite, entonces la llamada actual sólo se retrasa por una garrapata. Sería muy fácil para usar este método para ejecutar cosas en 10 ms o 100 ms intervalos.

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