Procesos concurrentes en MCUs

2

¿Es posible lograr una funcionalidad concurrente similar a FPGA en, por ejemplo, ARM Cortex-4?

Si tengo un proceso que realiza cálculos sensibles al tiempo y, al mismo tiempo, me gustaría escuchar si se presiona un botón. Incluso si utilizo interrupciones para los botones, hará una pausa en los cálculos de tiempo para que un bit ejecute la función de impresión.

Creo que lo que estoy preguntando es: ¿cómo simular los hilos en el hardware?

    
pregunta Arturs Vancans

7 respuestas

4

Los FPGA tienen ejecución concurrente no por subprocesos, sino por rutas de ejecución paralelas reales. Puede haber algunas puertas en una parte del dado realizando una adición, mientras que otras puertas en otra parte del dado están realizando otra adición.

Los subprocesos son una de las muchas abstracciones de programación que hacen parecer que una CPU puede ejecutar múltiples tareas cuando realmente no puede ( multitarea ). No simularía los subprocesos en un Cortex, solo los implementaría, o más probablemente al seleccionar un sistema operativo o una biblioteca que ya haya implementado la funcionalidad para usted.

Independientemente de lo que haga, ya se trate de tareas multitarea cooperativas, multitareas preventivas, procesamiento de interrupción (eventos), tendrá que manejar la realidad de que cada CPU puede hacer una sola cosa. Si necesita hacer algo más, lo que estaba haciendo debe ser interrumpido o debe ceder el control. Si realmente necesita hacer más de una cosa, necesita más de una CPU o una CPU con varios núcleos.

El problema se convierte en un equilibrio entre la necesidad de hacer cosas ahora y la necesidad de hacer otras cosas. Los sistemas operativos en tiempo real se han desarrollado para solucionar este problema. Dependiendo de la complejidad de su problema y sus necesidades, un RTOS puede ser demasiado complejo, y solo tendrá que hacer todo lo posible para minimizar el impacto de la multitarea y las interrupciones en su programa. Por lo general, esto significa establecer las prioridades de interrupción adecuadas si la plataforma lo admite, y mantener a los manejadores de interrupciones rápidamente para minimizar latencia de interrupción . >     

respondido por el Phil Frost
2

En el Cortex, tendrá un solo núcleo / ruta de ejecución, por lo que lo que está preguntando no es posible. Un hilo separado o una interrupción de cualquier tipo retrasará hasta cierto punto la ejecución de otras tareas. Es posible que pueda optimizar eso para reducir el retraso, pero siempre estará presente en cierta medida.

Una opción a considerar es un procesador esclavo separado, como un microcontrolador barato que puede manejar las pulsaciones de botones y tareas similares de tiempo crítico y luego sondearse desde el procesador principal. Eso podría implementar un protocolo serial simple, por ejemplo, para recuperar eventos que hayan ocurrido desde la última vez que se verificó.

    
respondido por el PeterJ
2

Si bien la respuesta de PeterJ es casi totalmente correcta, hay una cantidad de casos limitados que quedan fuera de esa generalización: de alguna manera muy limitada, su MCU tiene formas de hacer más de una cosa a la vez, pero solo si una de las cosas que necesita hacer está integrada en el hardware de la MCU:

  • El ejemplo más simple de esto es PWM: la mayoría de las MCU pueden producir ondas cuadradas con ciertas características mientras ejecutan su código
  • De manera similar, si su MCU tiene soporte de hardware para el protocolo SPI, puede estar enviando un carácter mientras ejecuta su código (por ejemplo, preparando el siguiente carácter para enviarlo)
  • Lo mismo se aplica al uso de USART y a otra transmisión o recepción en serie

Los ejemplos en hojas de datos usualmente no aprovechan este hecho. Por ejemplo, para AVR, los ejemplos de SPI se ven así (pseudocódigo)

Loop:
   Prepare byte of data
   Write data to register
   Wait for send to finish
   Go to loop

Puede aprovechar las débiles capacidades de multiprocesamiento reescribiendo el código de la siguiente manera:

Loop:
   Prepare byte of data
   Wait for send to finish
   Write data to register
   Go to loop

De esta manera, los datos se preparan mientras se envían: casi como hacer dos cosas a la vez. Lo mismo se puede lograr usando interrupciones, sin embargo, generalmente tienen una gran sobrecarga y, como resultado, no proporcionan una ventaja sobre el código de sondeo para eventos relativamente frecuentes, al menos en la plataforma AVR.

    
respondido por el angelatlarge
2

Además de varias otras respuestas:

Puede deshabilitar las interrupciones durante los cálculos de tiempo crítico, luego la interrupción (presión del botón) se revisará una vez que las vuelva a habilitar. Las pulsaciones de botones no son demasiado sensibles al tiempo.

    
respondido por el jippie
1

Echa un vistazo a Parallax Propeller (www.parallax.com) que tiene 8 procesadores independientes, cada uno con un espacio de programa de 2kB. Cualquier procesador puede acceder a cualquiera de los 32 pines de E / S digitales y a los 32kB de la memoria del Hub compartida. Cada productor (COG en Propeller) es capaz de interactuar con los otros COG a través del espacio de memoria compartida. Es programable en sus idiomas nativos, Spin o PASM o C o BASIC o Forth.

    
respondido por el mindrobots
1

A las respuestas anteriores, agregaría que la razón por la que los microcontroladores están tan capacitados para hacer una cantidad relativamente pequeña de circuitos es que en la mayoría de los diseños hay relativamente pocas cosas que realmente deben hacerse "simultáneamente". Si es necesario realizar dos tareas simultáneamente, se requerirán circuitos separados para las dos tareas. Sin embargo, si las tareas se pueden realizar en momentos discretos, entonces es posible que un solo conjunto de circuitos realice una tarea y luego la otra. La razón por la que incluso un procesador simple puede realizar tantas funciones complicadas es que los circuitos solo deben dedicarse a una tarea mientras se está realizando. El resto del tiempo, los circuitos se pueden utilizar para otros fines.

    
respondido por el supercat
0

Compruebe XMOS y su xCORE , ya que afirman que "el microcontrolador multinúcleo xCORE es capaz de ejecutarse en tiempo real múltiples tareas simultáneamente "

    
respondido por el Kvegaoro

Lea otras preguntas en las etiquetas