¿Cómo puedo saber si la frecuencia del reloj de mi microcontrolador es lo suficientemente rápida?

5

He estado usando los microcontroladores ARM de NXP en productos comerciales con gran éxito durante los últimos 2 años.

En la mayoría de mis proyectos, no uso el PLL para aumentar la frecuencia del oscilador porque nunca encontré que fuera necesario (nunca sentí que la frecuencia del reloj fuera un problema) y porque el PLL aumenta ligeramente el consumo de energía.

Sin embargo, no sé cómo puedo medir qué frecuencia de reloj es suficiente para alimentar mi código. Me quedo con esta pregunta en mi cabeza porque, como es posible que sepa que cuanto más rápido use el reloj, más poder consumirá. Dado que en estos días los equipos portátiles con baterías limitadas son comunes, este es un tema importante.

La pregunta principal aquí es ¿cómo puedo saber si la frecuencia de reloj actual es suficiente para mi código?

En esta pregunta, indico "detenciones o retrasos" porque asumo que si la frecuencia de mi reloj no es suficiente, el primer síntoma que ocurrirá es un tiempo de respuesta lento de las rutinas que consumen tiempo.

Utilizo en casi mis proyectos un sistema de máquina de estado que tiene una función OnIdle() que se llama cuando el sistema no tiene ningún evento para procesar, por lo que puede poner a la MCU en un modo de bajo consumo. Estaba pensando en medir cuánto tiempo permanece el sistema en esta función y registrar las marcas de agua mínimas y máximas de esta medida para tener números reales sobre si el reloj actual del sistema es suficiente o no.

¿Alguien tiene sugerencias para esto?

    
pregunta RHaguiuda

3 respuestas

8

En caso de que sea difícil o imposible estimar la frecuencia requerida teóricamente (según los cálculos y el conocimiento de la microarquitectura) o según la experiencia (código similar en una máquina similar), se puede adoptar el enfoque empírico. Una técnica común para escribir una aplicación incrustada en tiempo real es tener el bucle principal durante un tiempo fijo. Que tu bucle principal se verá algo así:

while (true)
{
    doStuff();
    waitSync();
} 

waitSync aquí está controlado por algún tipo de interrupción del temporizador. Al agregar un indicador como GPIO pin de salida como este:

while (true)
{
    gpioOn();
    doStuff();
    gpioOff();
    waitSync();
} 

y al colocar una sonda de alcance en ese GPIO, obtendrás un buen tren de pulsos, cuyo ciclo de trabajo indicará el porcentaje del tiempo de CPU, cuando en realidad está "haciendo cosas".

    
respondido por el Eugene Sh.
3

Estás pensando en esto al revés. La pregunta no es "¿cómo puedo saber si mi código que funciona con su reloj actual es suficiente?" , ¿es "cómo diseñar mi código para que sepa si está funcionando correctamente?

Los microcontroladores son algo opacos. Son una plataforma difícil de depurar. Debe desarrollar el hábito de dividir el código en trozos comprobables, utilizando técnicas como el cambio de bits para probar cada trozo y luego probar todo el sistema. Construir en las pruebas debería formar parte de su proceso, y comienza antes de escribir cualquier código

    
respondido por el Scott Seidman
3

Hay diferentes maneras de quedarse sin tiempo con el código del microcontrolador. Puede quedarse sin ancho de banda total, en cuyo caso definitivamente tiene que cambiar algo (mejores algoritmos, mayor frecuencia de reloj, tal vez una mejor arquitectura).

Antes de que eso suceda, es posible que obtenga efectos más sutiles, como la inestabilidad excesiva en las rutinas de servicio de interrupción o el servicio de eventos de baja prioridad, como la interfaz de usuario.

Por lo general, es conveniente tener un poco de margen en el ancho de banda total, ya que la velocidad (o la memoria) no es muy divertida a menos que tenga una ruta de actualización clara (como el arranque, la velocidad del reloj o la caída de una manera más costosa). micro que es compatible hacia arriba).

Puede perfilar el código en la simulación o al alternar un pin GPIO como sugiere Eugene, sin embargo, tenga en cuenta que en micros como el ARM, el GPIO se desacopla del micro núcleo mediante un bus relativamente lento, por lo que el perfilado se debe realizar relativamente trozos de tiempo grueso.

También debe consultar las especificaciones (y quizás la prueba) para ver qué son las compensaciones con la velocidad del reloj y los numerosos modos de funcionamiento del micro. Si solo está inactivo en los bucles de espera y no está haciendo ningún control de potencia, parte de la corriente de suministro será proporcional a la frecuencia (a un primer orden). Sin embargo, si se está despertando, haciendo algunas cosas, y luego se va a dormir, el efecto de una frecuencia de reloj más alta puede no ser tan significativo (incluso podría ser una mejora), ya que el ciclo de trabajo será menor y quizás algunos periféricos puedan serlo. poner en un modo de bajo consumo durante más tiempo en la frecuencia de reloj más alta.

    
respondido por el Spehro Pefhany

Lea otras preguntas en las etiquetas