Consumo de energía de ARM Cortex M: dormir con velocidades de reloj más altas frente a velocidades de reloj más bajas

Estoy empezando con procesadores Cortex M, pero tengo mucha experiencia con MCU de 8 bits.

Digamos que tengo un búfer que debe actualizarse cada 5 ms. Hay una interrupción que ocurre cada 5 ms y el búfer se actualiza y se ejecutan los cálculos necesarios. La MCU vuelve a dormir, hasta que ocurre la siguiente interrupción.

A 500 KHz en mi MCU 8051, esta tarea tarda 3 ms. A 32MHz en mi MCU 8051, esta tarea toma (número compuesto) 0.2ms.

En el 8051, descubrí que requería menos corriente para ejecutar la MCU a 500 KHz y dormir durante menos tiempo entre la interrupción de 5 ms, en lugar de ejecutarlo a la velocidad más rápida (32 MHz) y dormir más.

En un PIC, fueron los resultados inversos. Era mejor ejecutar la MCU rápido y dormirla rápidamente. (PIC tiene una gran AppNote sobre el ahorro de energía, y mencionan ambos enfoques).

Para los procesadores Cortex M, ¿es más eficiente energéticamente ejecutar el sistema rápidamente y dormirlo rápidamente? ¿O debería apuntar a la velocidad de reloj más lenta?

Entiendo que este cálculo depende de la tarea, obviamente si necesita una interrupción de 48 MHz (o cualquiera que sea la velocidad máxima del reloj de MCU), este es un punto discutible.

Pero, en general, ¿qué han visto al perfilar sus sistemas?

Estoy seguro de que el Cortex M usa menos energía por aumento de MHz según la hoja de datos, pero que me aspen si mi 8051 dice lo mismo, pero en realidad no funciona así cuando comencé a mezclar los modos de ahorro de energía. .

Ver que el Cortex M4F utilizado en los chips Nordic BLE funciona con 64 MHz y usa muy poca energía en promedio me hace pensar que las ráfagas rápidas y el sueño prolongado son más eficientes. En mis proyectos, el controlador está activo todo el tiempo, por lo que no tengo mediciones al respecto. Un colega dijo que la hora de activación del reloj era la diferencia crucial entre dos controladores (ambos Cortex M0), por lo que no estoy seguro de que haya una respuesta general para esto.

Respuestas (1)

Esto depende mucho de su aplicación exacta, MCU exacta y circuito exacto. No hay una opción definitiva entre "dormir mucho, correr rápido" o "correr lento todo el tiempo", ya que hay muchas formas de "dormir" y "correr".

La mayoría de las MCU tienen diferentes modos de "profundidad" de suspensión. Puede dormir con el oscilador interno de 32kHz, despertarse y luego ejecutar desde un oscilador interno más rápido, o iniciar un PLL interno y multiplicar el oscilador para obtener una velocidad más alta (pero el PLL toma tiempo = energía para comenzar), puede despertarse y comenzar un cristal externo (también requiere tiempo y energía para estabilizarse).

Algunas MCU tienen periféricos que pueden hacer mucho sin usar la MCU (p. ej., el PRS en EFM32). Si dice que necesita una interrupción periódica para calcular algo, entonces probablemente también necesite ingresar los datos (a menos que solo importe el estado interno). Algunas MCU pueden usar temporizadores y DMA para activar el ADC, transferir datos y solo reactivar la CPU cuando, p. 1000 muestras están listas, por lo que puede dormir mucho más si solo cambia los requisitos de su aplicación.

En un proyecto en el que trabajé, un STM32L011 tenía la mejor eficiencia energética cuando dormía con un oscilador interno de 32 kHz y funcionaba con un oscilador interno de 2,1 MHz. No generalices. Si mis cálculos fueran más exigentes, entonces tal vez aumentar la velocidad del reloj para reducir el tiempo de procesamiento podría brindar una mejor eficiencia energética (incluso a expensas de tener que esperar a que el sistema del reloj se reconfigure y estabilice).

¿Es 2.1MHz la velocidad máxima a la que puede funcionar el oscilador en la serie L? (Soy principalmente un tipo de 8 bits, no conozco el ámbito de ARM Cortex M, supongo que no). ¿Intentó aumentar el reloj para acelerar el oscilador interno y medir su velocidad actual? La pregunta no es realmente sobre los modos de suspensión, simplemente mantenga constante el modo de suspensión que desee, ¿observó un beneficio en el procesamiento de ráfagas cuando realizó su medición?
Creo que es el oscilador HSI (interno de alta velocidad) estándar en STM32, pero solo he usado el STM32L011. No trate a Cortex-M como algo uniforme: un STM32L011 es muy diferente de un MKE06Z128 (ambos M0+) y aún más diferente de un NXP K64. El sistema de reloj es totalmente diferente entre fabricantes (y familias). La "única" cosa en común es el conjunto de instrucciones, el sysstick y los registros de depuración.