Consideración de diseño: Cortex M0 vs Cortex M4 para aplicaciones IoT [cerrado]

Estoy diseñando un dispositivo IoT con muchos sensores que se integrarán mediante interfaces seriales como UART, SPI, I2C, etc. Para las capacidades de comunicación, planeo usar Wi-Fi (IEEE 802.11). ¿Tiene sentido usar algo como Wi-Fi SoC de Atmel y SAM D21 ARM Cortex-M0+ MCU o usar Cortex M4 de Atmel y luego integrar un módulo WiFi usando SPI o UART (no una solución SoC)?

  • Si elijo la opción M0, tengo la ventaja de Wifi y MCU en un solo chip.
  • Con M4, tendré que integrarlos usando alguna interfaz serial. Pero la ventaja es un procesador más rápido.

Dado que tengo muchos periféricos a bordo, ¿tiene sentido usar una CPU Cortex M4 que es mucho más rápida y capaz?

Editar : estoy seguro de que esto se basa en opiniones. Pero estoy buscando algunas entradas de diseño válidas que me ayuden a tomar esta decisión. Por ejemplo,

  • Planeo integrar un almacenamiento SD, un reloj en tiempo real, una cantidad de sensores: temperatura, energía, etc. La cantidad de periféricos puede ser de 10 a 12. Todos integrados a través de UART, SPI e I2C. También planeo tener comunicación - Wifi, RF, GSM, Ethernet, etc.

  • No necesito ninguna capacidad matemática extrema. La unidad FPU sería agradable pero no obligatoria.

Lo que busco son respuestas a preguntas como...

  1. ¿Tener muchos periféricos significa que necesito un procesador más grande y más rápido? Sé que esto puede ser manejado por ATMega. Estaba usando un ATMega de 8 bits para algo similar. Funcionó. Pero me estoy mudando a una plataforma más grande con más periféricos.
  2. ¿Me ayudará la elección de un procesador más grande como M4 y M7 a manejar operaciones urgentes como RF, WiFi y comunicación de sensores?
  3. ¿Cómo se elige en base a principios de diseño válidos? ¿Hay un conjunto de reglas?
  4. ¿La mayor velocidad del procesador, RAM y Flash significan que es más fácil trabajar con ellos cuando cambio entre diferentes periféricos?

Además: soy un ingeniero eléctrico con habilidades de programación integradas amateur/decentes. No es el mejor pero decente.

Los principales problemas con esta pregunta, en mi opinión, son: 1. Está casi completamente basada en opiniones, también porque (pero no limitado a): 2. No especifica nada sobre las capacidades matemáticas requeridas. Lo que habla puede ser manejado por un ATMega, si no por Tiny. 3. No especifica nada sobre sus propias habilidades de diseño, en comparación con la construcción del diseño en torno a cualquier opción.

Respuestas (2)

Para responder sumariamente a sus puntos centrales;

En el manejo de la comunicación con dispositivos periféricos, lo más importante es seleccionar el procesador correcto con el soporte correcto para los buses de hardware que está utilizando. Hay muchas maneras de hacer muchos tipos de comunicación, pero la mayoría de los elementos habilitados para SPI que debería preocuparte como aficionado algo experimentado estarán en el rango de 10 a 20 MHz de SPI como máximo.

Eso significa que su periférico SPI registrará un byte por cada 20 ciclos de reloj de núcleo en una CPU de 48 MHz en los momentos de mayor actividad. En un entorno interrumpido bien diseñado que es más que suficiente si no está haciendo grandes cantidades de enmascaramiento, cambio, adición y división en cada byte individual, para cada byte.

Además, ir a 80 MHz no te ayudará significativamente allí si comienzas a atragantarte.

Por lo tanto, es mucho mejor encontrar un procesador con un buen soporte para la gestión de periféricos, como un sistema DMA/uDMA que se pueda utilizar para grandes transferencias y un buen hardware FIFO, si es posible, que contenga al menos 4 bytes de datos (2 de 16 bits). palabras, o 1 qword de 32 bits, o solo 4 bytes), por lo que puede generar valores int32 de forma masiva.

Lo que más lo ayudará con las consideraciones en tiempo real es comprender cómo funcionan las interrupciones y cómo usarlas de manera eficiente sin bloquear grandes cantidades de tiempo del procesador. Después de todo, mientras el periférico en serie está saliendo o ingresando datos a unos pocos MHz, su núcleo no necesita hacer nada al respecto, siempre que elija el controlador correcto con el tipo correcto de soporte de hardware.

La cantidad de RAM interna (o RAM externa paralela rápida, pero en serio, no querrás comenzar a pensar en eso en este punto de tu 'carrera') que necesitas estará determinada por la cantidad de datos que generará una cosa en el tiempo. otra cosa necesita manejar la salida de la misma. Si se asegura de que su tubería de salida (¿probablemente WiFi?) sea rápida y sus sensores generen un orden de magnitud menos de datos, no necesitará tanta RAM siempre que administre bien el flujo. Si crea paquetes de datos de 5 kB cuyo inicio depende del final a través de su propio diseño tonto, necesitará más RAM que cuando los crea, por lo que no hay dependencia fuera de los bloques de 512 bytes (o menos).

Una velocidad de núcleo más rápida no lo ayudará mucho si todo lo que está haciendo es moverse unos pocos bytes alrededor de cada interrupción que recibe. Si necesita SPI de súper alta velocidad (que el módulo WiFi probablemente no admitirá si es asequible de todos modos), necesita un procesador con un reloj periférico de alta velocidad y controladores de pines de E/S de alta velocidad y baja capacitancia, en lugar de que uno con un núcleo rápido.

Parafraseando anecdóticamente: ahora estoy usando un procesador M4 para hacer algo que se podría haber hecho con un Atmega de 20 MHz, si no fuera por el hecho de que la interfaz de bus que algunos estúpidos especificaron necesita Bit-Banging de muy alta velocidad y FPGA son no es una opción en este diseño. Entonces, estoy ingresando, digamos, 5 Mbps de datos y emitiéndolos a través de periféricos estándar como I2C y SPI, y todo se decodifica, se matifica y demás, pero el 70 % de las veces mi núcleo hace algo, está golpeando la entrada de 5 Mbps y decidiendo rápidamente. en decisiones bit a bit. Quita eso y podría haber elegido al menos una MPU 8 veces más barata. Porque casi todo lo demás es interrupción y hardware en el que el núcleo no hace absolutamente nada.

Gracias. Esto ayudó Estaba buscando información en la línea que explicaste. Las interfaces seriales con manejo de interrupciones serán la parte principal del proyecto. Tengo un montón de sensores SPI esclavos (8 - 10), WiFi (UART) y RF (SPI). También almacenamiento (SPI) y RTC (I2C). Así que estoy viendo alrededor de 15 periféricos: SPI, UART y SPI. La mayor parte del tiempo se dedicará a manejar interrupciones, dopar un procesamiento mínimo y luego enviar datos a través de Wifi/RF. Estoy viendo paquetes de datos de 50 a 100 bytes. Planeo ejecutar algoritmos localmente. FPU podría ser útil aquí.
Estaba mirando algunas pautas de diseño para seleccionar un controlador. Algunos de los puntos planteados fueron 1) ¿Existen sensores/lazos de control de alta frecuencia? 2) ¿Examinar con qué frecuencia se debe ejecutar cada tarea? Esto es interesante porque si tengo 10 - 15 periféricos, estoy recorriendo al menos 10 funciones para verificar el estado/realizar algo. Además, ¿cómo calculo 2? ARMs Cortex M7 fue lanzado para el mercado de IoT. ¿Tiene sentido considerar eso o es una exageración?
@AGM Para ser honesto, todavía no me ha dado nada que me haga pensar que necesita una velocidad central significativa o potencia de procesamiento. WiFi es más fácil con un núcleo de 32 bits, pero de lo contrario habría adivinado que hay XMega con buses periféricos overclockeados que incluso podrían ganar desde un M0+ a 48 MHz en un argumento de rendimiento, especialmente en un UART. Además, ¿por qué un WiFi UART? ¿Existen siquiera? Asíncrono donde síncrono está fácilmente disponible está tirando el rendimiento por el desagüe por completo.
Esta es la arquitectura que tengo hasta ahora 1 RF (esclavo SPI), 1 almacenamiento SD (esclavo SPI), 1 RTC (I2C), 1 WiFi (UART/SPI), 12 sensores de temperatura/energía (esclavo SPI) Un total de 15 periféricos Cada uno de estos sensores recopila datos y los transmite a RF o a la nube a través de Wifi. Todo el sistema es sensible al tiempo donde tengo que procesar, enviar y recibir en < 2s. Tengo un procesamiento básico, como la conversión de protocolo de RF <--> Wifi. Además, planeo tener un algoritmo que recopile datos de todos estos sensores y determine el estado del sistema. Tendré unos 15 periféricos con unos 8-10 sensores.
Esto se está convirtiendo rápidamente en "esto es mi material, ayúdame a diseñarlo". Aunque puedo decir inequívocamente que en la programación completa, 2 segundos son años, incluso para un núcleo de 2 MHz (¡4 MILLONES de relojes en eso!). Entonces, si esa es su única limitación, deje de preocuparse y solicite una placa de desarrollo al azar. O basado en el costo de la solución. Si desea cosas WiFi de tipo host, obtenga una con un bloque criptográfico y, de todos modos, casi no hará cálculos matemáticos con su núcleo.
Bueno, no estoy tratando de ser grosero o arrogante aquí. El hecho de que esté haciendo esas preguntas no significa que te esté pidiendo que diseñes el producto y estoy seguro de que también eres consciente de que solo decidir el tipo de CPU no es igual a un producto terminado. Tengo una verdadera dificultad para elegir una CPU con tantos recursos en el mercado. Ningún curso o recurso académico o de ingeniería en línea le dice cómo hacerlo. He hablado con muchos diseñadores integrados sobre cómo suelen elegir el producto y generalmente se debe a su afinidad con un fabricante o núcleo o su experiencia con ese producto.
Rara vez es una elección de ingeniería pura o de diseño integrado. De todos modos realmente aprecio toda su ayuda!!
@AGM Solo quería señalar que la totalidad de la discusión aquí se está desviando cada vez más de "que otra persona pueda volver a utilizarla" y que esto resta valor a mi interés básico como parte de este sitio web. Estoy de acuerdo en que muchos ingenieros tienden a apegarse a lo que saben si no hay una buena razón para no hacerlo. Yo mismo incluido. El punto principal en todas mis respuestas es que las personas en estos días también parecen tener una tendencia a subestimar lo que puede hacer una CPU cuando no está ejecutando un sistema operativo de 30 años en desarrollo. es decir, ¡1MHz 16bit nos puso en la luna!

Creo que m4 sería mejor ya que el reloj de la CPU es mucho más rápido, puede conservar energía (que creo que es un factor importante en IOT) al pasar al modo de suspensión rápidamente. Además, la integración mediante la interfaz serial no es un problema, la utilidad debería ser un problema en la consideración del diseño. Además, está utilizando M0+ no M0, M0+ fue diseñado para aplicaciones de baja potencia en mente. Sin embargo, si está buscando algo elegante, le recomiendo que eche un vistazo a cortex M4f. pero le he dado una visión general para alguien dispuesto a dar el paso como un interés.

Pero como señaló @Asmyldof, hay muchos factores que pueden afectar sus decisiones de diseño. Por lo tanto, sería mejor si los finaliza antes de seleccionar su elección de MCU...

Gracias @fazkan. Error mío... tienes razón, es M0+. ¿Puede señalarme algunos recursos que me ayudarán a comprender los factores de los que está hablando que afectarán mis decisiones de diseño y elegir MCU? Ya tengo una lista de periféricos que quiero integrar y la interfaz que soportan. Por ejemplo: WiFi (UART), sensor de temperatura (SPI), RF (SPI), SD (SPI), RTC (I2C), etc. He reducido el fabricante y el componente particular. Todo lo que me queda es elegir la MCU.
sí, hay un gran artículo que leí hace un tiempo... espera, déjame revisar.... enlace , este es el artículo básico... entonces puedes encontrar mucha información en el sitio web de ARMS... atmel.com/images /mcu_vs_mpu_article.pdf , aquí hay otro que debería darle una idea de las medidas y diferencias de MCU... ¿Puede votar la respuesta si le ayudó? Gracias...