Midiendo el rendimiento del firmware

2

Estoy usando el compilador C y los controladores PIC. Me he estado preguntando acerca de la medición del rendimiento del código f / w que escribimos. Tengo dos versiones de estructuras para el mismo código:

Primero : usando while

main()
  {..
   .. 
  initialization;

  while(check for conditions)
  {...
  ..
  .
  }

}

Segundo : uso de estados secuenciales o máquinas estatales.

main()
    {..
     .. 
    initialization;

    switch(state n)
    {...
    ..
    .
     }

    }

Bueno, mi duda es que si lo hago de cualquier manera, ¿cómo mediré cuál es la mejor manera de avanzar? Me di cuenta de que la función de sondeo del método primero a menudo se usa en sistemas integrados simples. Mientras que las máquinas de estado del segundo se usan principalmente para sistemas integrados de un solo procesador.

  • ¿Cómo puedo medir qué firmware es mejor?
  • ¿Cómo puedo monitorear las estadísticas y los datos de rendimiento relacionados?
  • ¿El compilador produce datos valiosos para verificar, o son los depuradores que debo confiar?
  • ¿Cuáles son las herramientas comunes disponibles para medir el rendimiento de un firmware?
  • ¿Es posible con un depurador como Pickit3 / ICD3? Tengo un pickkit3 a la mano.

Estaré extremadamente agradecido si comparte su conocimiento sobre cómo tratar con firmwares y Aclarando mi duda.

    
pregunta Rookie91

5 respuestas

6

Si usa MPLAB, simplemente simule con la función "Cronómetro".

Puede insertar puntos de interrupción y perfilar el código, según el ciclo. Muy útil.

Por supuesto, puedes mirar el Indicador de uso de la memoria y ver el tamaño del código cuando se compila.

También es útil mirar el código desensamblado, como han sugerido otros, especialmente en ISR ajustados.

    
respondido por el Spehro Pefhany
4

En términos de rendimiento de velocidad, recomendaría encarecidamente utilizar el rey indiscutible de la evaluación comparativa de firmware: el osciloscopio. Realmente no puedes ser un desarrollador de firmware profesional sin tener acceso a uno.

La fluidez de medición de rendimiento de su IDE o enlazador puede ser útil, pero al final todavía tendrá que probar y verificar su sincronización en el mundo real, fuera del IDE.

    
respondido por el Lundin
2

¿Cuál es su medida de "rendimiento": tasa de sondeo? latencia algo mas? Si rendimiento significa sondeos por segundo, es decir, simplemente desea el bucle más rápido posible, puede alternar un bit de salida y medir su frecuencia con un alcance o con medidores portátiles que puedan medir la frecuencia.

    
respondido por el JRobert
2
  

qué detalles obtengo del desmontaje. Nunca lo he hecho antes

     

¿El compilador produce datos valiosos para verificar, o son los depuradores que debo confiar?

Necesitará familiarizarse con el lenguaje de máquina de su PIC particular si desea comenzar a incursionar en la optimización. Muy a menudo, verás un código que parece bastante inocente en C, pero en términos de cuántas instrucciones de lenguaje de máquina se necesitan, bueno ...

El ejemplo canónico de la potencia del compilador PIC24 XC16:

_LATA0 ^= 1;            // toggle a bit

se convierte en esto en lenguaje de máquina:

mov.b _LATA,W0
and.b W0,#1,W0
btg W0,#0
and.b W0,#1,W0
and.b W0,#1,W2
mov.w #0x02c4,W1
mov.b [W1],W1
mov.b #0xfe,W0
and.b W1,W0,W0
ior.b W0,W2,W0
mov.b W0,0x02c4

aunque hay una instrucción de lenguaje de máquina de conmutación de bits btg . ¿Por qué pasó esto? Los compiladores de C a menudo no aprovechan el hardware especial en sus micros de destino a menos que los autores del compilador se dirijan específicamente a ese hardware.

Su primer paso en la optimización (antes de medir) debe ser una búsqueda rápida del desmontaje. Vea qué instrucciones de C se traducen al mayor número de instrucciones en lenguaje de máquina. Pruebe diferentes enfoques del problema y vea cuáles son los que dan menos instrucciones. Rápidamente acumulará experiencia con los patrones de código que debe evitar y con los que se debe mantener.

  

¿Cómo puedo medir qué firmware es mejor?

     

¿Cuáles son las herramientas comunes disponibles para medir el rendimiento de un firmware?

     

¿Es posible con un depurador como Pickit3 / ICD3? Tengo un pickkit3 a la mano.

Como han dicho otros, las formas más fáciles son generalmente:

  • alternando físicamente algunas líneas de E / S y midiendo con un alcance
  • utilizando la herramienta de simulador y cronómetro disponible en MPLAB

Usted 'envuelve' su código de destino con los conmutadores de bits (o puntos de interrupción) y mide cuánto tiempo lleva la ejecución. Luego, si encuentra un problema de rendimiento, vuelva a su desmontaje, averigüe qué código está demorando mucho tiempo y refactorícelo, luego vuelva a realizar la prueba.

    
respondido por el Adam Lawrence
2

Me gusta ver en términos de si mi sistema puede hacer lo que tiene que hacer en el tiempo que tiene. Actúo un poco en lugares críticos y me aseguro de tener suficiente espacio para realizar una tarea. En otros lugares, hago un uso liberal de las banderas, para asegurarme de que las cosas estén en forma para una rutina cuando se las llama, y una vez en la rutina, saldré con un código de error si no lo es.

En los sistemas integrados, grandioso es definitivamente el enemigo del bien en lo que se refiere a la optimización. El mejor firmware es el firmware que A) funciona, y B) hace lo que necesita hacer, mientras que C) sigue siendo comprensible y algo compatible. Optimizar más allá de eso puede ser una mala dirección de un recurso precioso.

Esto ciertamente está exagerando la situación, tal vez "hiperbólico" es un buen término para ello. En el Capítulo 8 (Haciendo más con menos) del gran libro de Elicia White O'Reilly " Making Embedded Systems ", ella dice:

  

En última instancia, la optimización es un problema económico. Comienza con una cartera de activos asociados con su sistema ... Su activo más líquido es el tiempo de desarrollo, así que piense en eso como dinero. Una vez que invierte (o asigna) (sic) estos activos a partes del sistema, pierde la oportunidad de usarlos en otros sistemas ...

     

Al considerar diferentes estrategias de optimización, considere también el alto costo de oportunidad que conlleva la inversión de sus activos. Comprar futuros es casi siempre más barato que esperar hasta el último minuto y darse cuenta de que está seriamente endeudado sin una forma fácil de recuperar.

Por lo tanto, asegurarse de comenzar con un sistema suficiente para hacer el trabajo es la parte más importante de la batalla, y si lo hace lo suficientemente bien, no necesitará comprimir el sistema para obtener un rendimiento.

    
respondido por el Scott Seidman

Lea otras preguntas en las etiquetas